Php 如果元素具有xmlns属性,Xpath将失败

Php 如果元素具有xmlns属性,Xpath将失败,php,xpath,simplexml,xml-namespaces,collada,Php,Xpath,Simplexml,Xml Namespaces,Collada,可能重复: 我正在尝试使用xml解析.COLLADA文件。问题是,如果根标记具有xmlns属性,我似乎无法使用xpath()访问元素 例如,这项工作: $string = <<<TEST <?xml version="1.0" encoding="utf-8"?> <COLLADA version="1.4.1"> <library_materials> <material id="Material" name="Mate

可能重复:

我正在尝试使用xml解析.COLLADA文件。问题是,如果根标记具有xmlns属性,我似乎无法使用
xpath()
访问元素

例如,这项工作:

$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=您需要注册名称空间:

$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中使用名称空间前缀来表示名称空间名称,那么声明前缀的方式取决于您使用的XPath处理器的API。

谢谢!实际上,我自己解决了这个问题,在所有查询中加入了*[namespace-uri()=''和ORIGINALEXPRESSION],但这是一个更加优雅的解决方案。
$lol = new SimpleXMLElement($string);
$lol->registerXPathNamespace('cada', 'http://www.collada.org/2005/11/COLLADASchema');
print_r($lol->xpath("child::cada:library_materials//*[@id='Material2']"));