XPath и PHP: ничего не работает должным образом

Вот мой код:

$XML = <<<XML <items> <item id="123"> <name>Item 1</name> </item> <item id="456"> <name>Item 2</name> </item> <item id="789"> <name>Item 3</name> </item> </items> XML; $objSimpleXML = new SimpleXMLElement($XML); print_r($objSimpleXML->xpath('./item[1]')); print "- - - - - - -\n"; print_r($objSimpleXML->xpath('./item[2][@id]')); print "- - - - - - -\n"; print_r($objSimpleXML->xpath('./item[1]/name')); 

Ничего особенного: я пытаюсь извлечь некоторые данные через XPath . Путь должен быть строкой для создания динамической программы, которая загружает свои данные из файла конфигурации XML .

При использовании доступа к объекту PHP, например $objSimpleXML->items->item[0]['id'] все работает нормально. Но подход XPath самом деле не работает. Приведенный выше код генерирует следующий результат:

 Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 123 ) [name] => Item 1 ) ) - - - - - - - Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 456 ) [name] => Item 2 ) ) - - - - - - - Array ( [0] => SimpleXMLElement Object ( ) ) 

Я согласен с первым выходом. Но во втором выводе возвращается весь элемент вместо атрибута. Зачем? И последнее листинг пуст вместо содержимого названия?

Это потому, что ваш XPath ошибочен. Вы используете предикаты, т.е.

 ./item[2][@id] 

что означает «второй item с атрибутом id », но, похоже, вы хотите

 ./item[2]/@id 

попробуйте это, если это не то, что вы ищете, пожалуйста, дайте лучший пример.

 <?php $XML = <<<XML <items> <item id="123"> <name>Item 1</name> </item> <item id="456"> <name>Item 2</name> </item> <item id="789"> <name>Item 3</name> </item> </items> XML; $objSimpleXML = new SimpleXMLElement($XML); $items = $objSimpleXML->xpath('./item'); print '<pre>'; print_r($items[0]); print "- - - - - - -\n"; print_r($items[1]->attributes()->id); print "- - - - - - -\n"; print_r($items[2]->name);