18

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

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

私はDOMDocumentオブジェクトにSelectionNamespacesを追加しようとしました:

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

こちらもご覧ください

4

3 に答える 3

22

を使用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"');

rss:ここでは、ドキュメントの既定の名前空間をXPath 式のプレフィックスに割り当てています。この変更を行うと、次の XPath 式が正しく機能するはずです。

nodes = doc.selectNodes('/rdf:RDF/rss:item/cb:statistics/cb:exchangeRate/cb:targetCurrency');

item正しい名前空間を使用して要素を参照するため、機能します。XPath 式と元のドキュメントで接頭辞が異なるという事実は重要ではありません。重要なのは、プレフィックスがバインドされている名前空間です。

于 2011-05-11T08:50:39.247 に答える
1
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 オブジェクトにロードすることを忘れないでください

行く方法です

私はコメントするのに十分な評判を持っていません。しかし、その少しのおかげで多くの時間を節約できました。

どうもありがとう

于 2014-11-19T22:34:28.023 に答える
1

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

https://stackoverflow.com/a/11399681

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

于 2015-06-08T15:41:48.667 に答える