Вот моя проблема:
У меня есть файл XML с этим patern:
<doc_xml>
<ad>
<ref>123456</ref>
<date>20150101</date>
<title>My first child title</title>
</ad>
<ad>
<ref>897510</ref>
<date>20170211</date>
<title>My second child title</title>
</ad>
</doc_xml>
Я хочу сделать это, чтобы получить все данные одного из дочерних элементов <ad>, но только если значение <ref> равно (например) = 123456, поэтому в этом случае получите только этот список данных с моим запросом:
$ref = 123456;
$date = 123456;
$title = 'My first child title';
В настоящее время у меня есть этот код в PHP:
xml=simplexml_load_file("file.xml") or die("Error: Cannot create object");
$ref = '123456';
$data = $xml->xpath("/doc_xml/ad/ref[contains(., '$ref')]
");
print_r($data);
Это позволяет мне получить этот массив:
Array ( [0] => SimpleXMLElement Object ( [0] => 123456 ) )
Но я не могу найти, как получить значение другого ребенка (на том же уровне, <date>
и <title>
).
Надеюсь, я достаточно ясен. Любая помощь приветствуется, спасибо!
Условия в Xpath могут быть в любой позиции намного сложнее.
contains()
выглядит неправильно - например, 123456
содержит 234
. Я предлагаю использовать normalize-space()
и equals.
У вас есть два возможных решения:
ad
с помощью конкретного ref
вернуть элементы ad
: /doc_xml/ad
... с дочерним элементом ref
: /doc_xml/ad[ref]
... что соответствует конкретному тексту: /doc_xml/ad[normalize-space(ref) = '123456']
вернуть все ad
элементы: /doc_xml/ad/ref[normalize-space(.) = '123456']
С найденными элементами ref
качестве контекста возьмите title
sibling
../title
или:
parent::*/title
Использование узла в SimpleXML в качестве контекста означает, что вы вызываете метод xpath()
на этом узле. В DOM вы предоставляете его в качестве второго аргумента для DOMXpath::evaluate()
.
$data = $xml->xpath("/doc_xml/ad/ref[contains(., '$ref')]/parent::*");
print_r($data);
Найдите ребенка и переместите xpath
на parent
этого ребенка. Таким образом, вы получите массив данных следующим образом
Array ( [0] => SimpleXMLElement Object ( [ref] => 123456 [date] => 20150101 [title] => My first child title ) )
<ad>
:$data = $xml->xpath("/doc_xml/ad[ref='123456']")[0];
а затем выполнитеecho $data->title;
иecho $data->date;
посмотреть, как это работает: eval.in/460761