Intereting Posts

Ошибка Xpath, если элемент имеет атрибут aa xmlns

Возможный дубликат:
xPath не находит ничего, кроме *

Я пытаюсь использовать xml для анализа файла .COLLADA. Проблема в том, что я не могу использовать xpath() для доступа к элементам, если корневой тег имеет атрибут xmlns.

Например, это работает:

 $string = <<<TEST <?xml version="1.0" encoding="utf-8"?> <COLLADA version="1.4.1"> <library_materials> <material id="Material" name="Material"> <instance_effect url="#Material-effect"/> </material> <material id="Material2" name="Material"> <instance_effect url="#Material-effect2"/> </material> </library_materials> </COLLADA> TEST; $lol = new SimpleXMLElement($string); print_r($lol->library_materials->xpath("material[@id='Material2']")); 

Но это не так:

 $string = <<<TEST <?xml version="1.0" encoding="utf-8"?> <COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1"> <library_materials> <material id="Material" name="Material"> <instance_effect url="#Material-effect"/> </material> <material id="Material2" name="Material"> <instance_effect url="#Material-effect2"/> </material> </library_materials> </COLLADA> TEST; $lol = new SimpleXMLElement($string); print_r($lol->library_materials->xpath("material[@id='Material2']")); 

Как xmlns внезапно делает дерево xml непригодным для использования? Я думал, что он просто определил пространство имен, чтобы вы могли отличить его от других идентичных тегов в других пространствах имен. Что мне не хватает?

Вам необходимо зарегистрировать пространство имен:

 $lol = new SimpleXMLElement($string); $lol->registerXPathNamespace('cada', 'http://www.collada.org/2005/11/COLLADASchema'); print_r($lol->xpath("child::cada:library_materials//*[@id='Material2']")); 

Объявление пространства имен означает, что имена находятся в пространстве имен, но ваш XPath ищет имена без пространства имен. Способ поиска элементов с именами зависит от того, используете ли вы XPath 1.0 или 2.0, и насколько вы используете префиксы пространства имен в XPath для представления имен с именами, способ, которым вы объявляете префиксы, зависит от API к процессору XPath ты используешь.