web-dev-qa-db-ja.com

MSXMLを解析する際の宣言されていない名前空間プレフィックスへの参照

どうすれば解決できますか

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を名前空間で機能させるにはどうすればよいですか?


編集2

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');

も参照してください

16
Ian Boyd

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式と元のドキュメントでプレフィックスが異なるという事実は重要ではありません。重要なのは、プレフィックスがバインドされている名前空間です。

22
Phil Booth
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オブジェクトにロードすることを忘れないでください

行く方法です

コメントするのに十分な評判がありません。しかし、そこにあるそのビットは私に多くの時間を節約しました。

どうもありがとうございます

1
Jer WasHere

XMLSerializerを使用していてこのエラーが表示される場合は、ここで説明されているIEバグが発生している可能性があります:

https://stackoverflow.com/a/11399681

これが起こっていることに気付くのに時間がかかったので、これら2つの問題を関連付けるのが最善だと思いました。

1
murrayju