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


XPath doesn't match attributes without namespace as prefix

目前我正在尝试阅读不同的安装。通过PHP的SimpleXML.

不幸的是,没有预定义的结构,他们必须如何看。他们总是使用两个命名空间,"http://www.w3.org/1999/02/22-rdf-syntax-ns#"answers"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"]');

但是关于about属性的rdf前缀似乎有一个问题,因为它只返回一个结果,如果在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>

但是对于这个not:

<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中使用名称空间,所以我在这里问。

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

参见XML 1.0(第三版)中的名称空间:

默认命名空间声明适用于所有无前缀的元素其作用域内的名称。默认名称空间声明不适用直接到属性名;un前缀的解释属性是由它们所在的元素决定的。