XPath与没有名称空间的属性不匹配作为前缀

时间:2011-08-02 13:55:58

标签: php xpath attributes namespaces simplexml

目前我正在尝试通过PHP的SimpleXML读取Firefox扩展的不同install.rdf文件。

不幸的是,他们没有预定义的结构。 他们总是使用两个名称空间,“http://www.w3.org/1999/02/22-rdf-syntax-ns#”和“http://www.mozilla.org/2004/em-rdf#”。

所以我的想法是使用XPath来获取感兴趣的元素:

$xml = simplexml_load_string($installRDF);
$namespaces = $xml->getNameSpaces(true);
$xml->registerXPathNamespace('rdf', NS_RDF);
$main = $xml->xpath('/rdf:RDF/rdf:Description[@rdf:about="urn:mozilla:install-manifest"]');

但是rdf属性的about前缀似乎存在问题,因为如果RDF文件中还定义了前缀,它只会返回结果。

因此,它有效:

<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

  <RDF:Description RDF:about="urn:mozilla:install-manifest">
    <em:id>extension@mozilla.org</em:id>
  </RDF:Description>
</RDF:RDF>

但为此不是:

<RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
     xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

  <Description about="urn:mozilla:install-manifest">
    <em:id>extension@mozilla.org</em:id>
  </Description>
</RDF>

这看起来像PHP中的一个错误,因为如果我从XPath中删除该属性,我总是得到Description元素。但是我还没有意识到在XPath中使用命名空间,所以我在这里问。

1 个答案:

答案 0 :(得分:1)

问题是第二个示例中的属性位于空命名空间中。问题不在于查询,而是两个示例的XML数据不等同。

请参阅Namespaces in XML 1.0 (Third Edition)

  

默认名称空间声明适用于所有未加前缀的元素   其范围内的名称。默认名称空间声明不适用   直接属性名称;没有前缀的解释   属性由它们出现的元素决定。