どうすれば解決できますか
Reference to undeclared namespace prefix: '%s'
microsoftのmsxml実装に問題がありますか?
解析する必要のある値を含む政府のWebサイトからのXMLフィードを使用しています。 xmlには名前空間が含まれています。
<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/"
xmlns:cb="http://www.cbwiki.net/wiki/index.php/Specification_1.1"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3c.org/1999/02/22-rdf-syntax-ns#rdf.xsd">
<item rdf:about="http://www.bankofcanada.ca/stats/rates_rss/STATIC_IEXE0101.xml">
<cb:statistics>
<cb:exchangeRate>
<cb:value decimals="4">1.0351</cb:value>
<cb:baseCurrency>CAD</cb:baseCurrency>
<cb:targetCurrency>USD</cb:targetCurrency>
<cb:rateType>Bank of Canada noon rate</cb:rateType>
<cb:observationPeriod frequency="daily">2011-05-09T12:15:00-04:00</cb:observationPeriod>
</cb:exchangeRate>
</cb:statistics>
</item>
</rdf:RDF>
XPathクエリの実行:
/rdf:RDF/item/cb:statistics/cb:exchangeRate/cb:targetCurrency
エラーで失敗します:
Reference to undeclared namespace prefix: 'rdf'
編集:
元のXMLを編集して、名前空間の使用をすべて削除した場合:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf>
<item>
<statistics>
<exchangeRate>
<value decimals="4">1.0351</value>
<baseCurrency>CAD</baseCurrency>
<targetCurrency>USD</targetCurrency>
<rateType>Bank of Canada noon rate</rateType>
<observationPeriod frequency="daily">2011-05-09T12:15:00-04:00</observationPeriod>
</exchangeRate>
</statistics>
</item>
</rdf>
クエリ/rdf/item/statistics/exchangeRate/baseCurrency
は失敗せず、ノードを返します。
<baseCurrency>CAD</baseCurrency>
Microsoft XMLを名前空間で機能させるにはどうすればよいですか?
SelectionNamespacesをDOMDocumentオブジェクトに追加してみました:
doc.setProperty('SelectionNamespaces', 'xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cb="http://www.cbwiki.net/wiki/index.php/Specification_1.1"');
これで、xpathクエリは失敗しませんが、ノードも返されません。
nodes = doc.selectNodes('/rdf:RDF/item/cb:statistics/cb:exchangeRate/cb:targetCurrency');
SelectionNamespaces
を使用するのが正しいアプローチであり、名前空間が欠落しているだけです。
XMLドキュメントがデフォルトの名前空間を次のように明示的に設定していることに注意してください。
xmlns="http://purl.org/rss/1.0/"
これは、item
要素など、プレフィックスのない要素が実際にはデフォルトの名前空間にあることを意味します。したがって、XPath式を使用してその要素を選択する場合は、最初に適切な選択名前空間を設定する必要があります。
これを行うには、次のように呼び出しをsetProperty
に変更できます。
doc.setProperty('SelectionNamespaces', 'xmlns:rss="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cb="http://www.cbwiki.net/wiki/index.php/Specification_1.1"');
ここでは、ドキュメントのデフォルトの名前空間をXPath式のrss:
プレフィックスに割り当てています。この変更を行うと、次のXPath式が正しく機能するはずです。
nodes = doc.selectNodes('/rdf:RDF/rss:item/cb:statistics/cb:exchangeRate/cb:targetCurrency');
正しい名前空間を使用してitem
要素を参照するため機能します。 XPath式と元のドキュメントでプレフィックスが異なるという事実は重要ではありません。重要なのは、プレフィックスがバインドされている名前空間です。
doc.setProperty('SelectionNamespaces', 'xmlns:rss="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cb="http://www.cbwiki.net/wiki/index.php/Specification_1.1"');
Xsdファイルまたはスキーマをxmldocオブジェクトにロードすることを忘れないでください
行く方法です
コメントするのに十分な評判がありません。しかし、そこにあるそのビットは私に多くの時間を節約しました。
どうもありがとうございます
XMLSerializer
を使用していてこのエラーが表示される場合は、ここで説明されているIEバグが発生している可能性があります:
https://stackoverflow.com/a/11399681
これが起こっていることに気付くのに時間がかかったので、これら2つの問題を関連付けるのが最善だと思いました。