Xpath не работает, если элемент имеет атрибут 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-дерево непригодным для использования? Я думал, что он просто определяет пространство имен, чтобы вы могли отличить его от других идентичных тегов в других пространствах имен. Что мне не хватает?


person Callum    schedule 12.03.2011    source источник


Ответы (2)


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

$lol = new SimpleXMLElement($string);
$lol->registerXPathNamespace('cada', 'http://www.collada.org/2005/11/COLLADASchema');
print_r($lol->xpath("child::cada:library_materials//*[@id='Material2']"));
person Ewan Heming    schedule 13.03.2011
comment
Спасибо! на самом деле я решил это сам, поместив *[namespace-uri()='collada.org/2005 /11/COLLADASchema' и ORIGINALEXPRESSION] во всех моих запросах, но это гораздо более элегантное решение. - person Callum; 13.03.2011

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

person Michael Kay    schedule 13.03.2011