SimpleXML: выбор элементов, имеющих определенное значение атрибута - PullRequest
31 голосов
/ 14 июня 2009

В документе XML у меня есть элементы с одинаковыми именами, но значение атрибута определяет, к какому типу данных это относится, и я хочу выбрать все эти элементы, которые имеют определенное значение из документа. Нужно ли использовать XPath (и если да, то можете ли вы предложить правильный синтаксис) или есть более элегантное решение?

Вот несколько примеров XML:

<object>
  <data type="me">myname</data>
  <data type="you">yourname</data>
  <data type="me">myothername</data>
</object>

И я хочу выбрать содержимое всех <data> тегов потомков <object>, тип которых me.

PS - я пытаюсь взаимодействовать с Netflix API с помощью PHP - это не должно иметь значения для моего вопроса, но если вы хотите предложить хороший / лучший способ сделать это, я весь слух.

Ответы [ 2 ]

46 голосов
/ 14 июня 2009

Попробуйте этот XPath:

/object/data[@type="me"]

Итак:

$myDataObjects = $simplexml->xpath('/object/data[@type="me"]');

И если object не является корнем вашего документа, используйте вместо него //object/data[@type="me"].

4 голосов
/ 26 мая 2012

Я только что сделал функцию, чтобы сделать это для меня; это только захватывает первый результат все же. Ваш пробег может отличаться.

function query_attribute($xmlNode, $attr_name, $attr_value) {
  foreach($xmlNode as $node) { 
    switch($node[$attr_name]) {
      case $attr_value:
        return $node;
    }
  }
}

Использование:

echo query_attribute($MySimpleXmlNode->Customer, "type", "human")->Name;

(для XML ниже)

<Root><Customer type="human"><Name>Sam Jones</name></Customer></Root>
...