SimpleXML: Выбор Элементов, Имеющих Определенное Значение Атрибута


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

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

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

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

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

Author: dimo414, 2009-06-14

2 answers

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

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

Итак:

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

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

 45
Author: Gumbo, 2009-06-14 08:46:24

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

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>
 4
Author: willbradley, 2012-05-26 01:29:50