我目前正試圖通過PHP的SimpleXML讀取Firefox擴展不同的install.rdf文件。XPath不無命名空間匹配的屬性前綴
不幸的是有沒有預定義的結構,怎麼也得看。 它們總是使用兩個名稱空間「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>[email protected]</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>[email protected]</em:id>
</Description>
</RDF>
這看起來像在PHP中我的錯誤,因爲如果我要從我的XPath的屬性總是獲得Description
元素。但是我不知道在XPath中使用名稱空間,所以我在這裏問。
好吧,默認命名空間不適用** **直接的屬性名稱。這對我來說就像沒有前綴的屬性和它們所在的元素一樣獲得了相同的名稱空間,這很好。雖然檢查它們的名稱空間,但我可以看到它是_null_,所以兩個XML示例實際上並不相同。感謝提示! –