Получать данные из XML с помощью PHP (но очень специфическое ограничение)

1

Вот моя проблема:

У меня есть файл 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>).

Надеюсь, я достаточно ясен. Любая помощь приветствуется, спасибо!

Теги:

2 ответа

2

Условия в 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']

Использовать Xpath с узлом ref как контекст

вернуть все ad элементы:
/doc_xml/ad/ref[normalize-space(.) = '123456']

С найденными элементами ref качестве контекста возьмите title sibling

../title

или:

parent::*/title

Использование узла в SimpleXML в качестве контекста означает, что вы вызываете метод xpath() на этом узле. В DOM вы предоставляете его в качестве второго аргумента для DOMXpath::evaluate().

1
$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 ) )
  • 0
    давайте упростим и перейдем непосредственно к узлу <ad> : $data = $xml->xpath("/doc_xml/ad[ref='123456']")[0]; а затем выполните echo $data->title; и echo $data->date; посмотреть, как это работает: eval.in/460761

Ещё вопросы

Сообщество Overcoder
Наверх
Меню