如果元素具有xmlns属性,则Xpath会失败

时间:2011-03-12 21:20:21

标签: php xpath simplexml xml-namespaces collada

  

可能重复:
  xPath finds nothing but *

我试图使用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 = <<<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树无法使用?我认为它只是定义了命名空间,因此您可以将其与其他命名空间中的其他相同标记区分开来。我错过了什么?

2 个答案:

答案 0 :(得分: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']"));

答案 1 :(得分:1)

名称空间声明意味着名称位于名称空间中,但您的XPath正在查找无名称空间中的名称。搜索命名空间元素的方式取决于您是使用XPath 1.0还是2.0,并且在XPath中使用命名空间前缀表示命名空间名称的程度,声明前缀的方式取决于XPath处理器的API你正在使用。