2011-08-02 65 views
4

我目前正試圖通過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中使用名稱空間,所以我在這裏問。

回答

1

的問題是,在你的第二個例子中,屬性是空的命名空間。問題不在於查詢,而是兩個示例的XML數據不相同。

Namespaces in XML 1.0 (Third Edition)

默認命名空間聲明適用於在其範圍內的所有前綴的元素 名。默認名稱空間聲明不直接將 應用於屬性名稱;前綴屬性的解釋是由它們出現的元素決定的。

+0

好吧,默認命名空間不適用** **直接的屬性名稱。這對我來說就像沒有前綴的屬性和它們所在的元素一樣獲得了相同的名稱空間,這很好。雖然檢查它們的名稱空間,但我可以看到它是_null_,所以兩個XML示例實際上並不相同。感謝提示! –

相關問題