目前,我正在尝试通过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"]');
但是在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>
但是对于这个不行:
<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的一个bug,因为如果我从XPath中删除属性,我总是会得到Description
元素。但是我还不知道如何在XPath中使用命名空间,所以我在这里问。