2011-08-02 34 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#"の2つの名前空間を使用しています。

だから私の考えは興味のある要素を取得するために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> 

しかし、これではないために:私は、XPathから属性を削除する場合私は以来

<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のバグのように見える、それは動作します。このためにそう

常にDescription要素を取得しています。しかし、私はまだXPathで名前空間を使用することに気づいていないので、私はここで尋ねています。

答えて

1

問題は、2番目の例の属性が空の名前空間にあることです。問題はクエリではありませんが、2つの例のXMLデータは同等ではありません。

Namespaces in XML 1.0 (Third Edition)を参照してください:

デフォルトの名前空間宣言は、その範囲内のすべての接頭辞を持たない要素 名に適用されます。デフォルトの名前空間宣言は、属性名に直接 を適用しません。接頭辞が付いていない の属性の解釈は、表示される要素によって決まります。

+0

いいえ、デフォルトの名前空間は**属性名に**直接**適用されません。接頭辞のない属性のようなものは、それらが入っている要素と同じ名前空間を取得します。これは問題ありません。それらの名前空間を調べると、それは_null_であることがわかります。実際、2つのXMLの例は同じではありません。ヒントありがとう! –

関連する問題