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