问题描述
我该如何解决
Reference to undeclared namespace prefix: '%s'
Microsoft 的 msxml 实现有问题吗?
problem with Microsoft's msxml implementation?
我正在使用来自政府网站的 XML 提要,其中包含我需要解析的值.xml 包含命名空间:
I'm using an XML feed from a government web-site that contains values i need to parse. The xml contains namespaces:
<?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 查询:
Running the XPath query:
/rdf:RDF/item/cb:statistics/cb:exchangeRate/cb:targetCurrency
因错误而失败:
Reference to undeclared namespace prefix: 'rdf'
编辑:
如果我编辑原始 XML 以删除所有命名空间的使用:
If i edit the original XML to remove all use of namespaces:
<?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
没有失败,并返回节点:
The query /rdf/item/statistics/exchangeRate/baseCurrency
doesn't fail, and returns nodes:
<baseCurrency>CAD</baseCurrency>
如何让 Microsoft XML 使用命名空间?
How do i get Microsoft XML to work with namespaces?
我尝试将 SelectionNamespaces 添加到 DOMDocument 对象:
i've tried adding SelectionNamespaces to the DOMDocument object:
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 查询不会失败,但它也不会返回任何节点:
Now the xpath query doesn't fail, but it also returns no nodes:
nodes = doc.selectNodes('/rdf:RDF/item/cb:statistics/cb:exchangeRate/cb:targetCurrency');
另见
- 未声明对命名空间前缀的引用"错误
- XMLReader - 如何处理未声明的命名空间
- PRB:在 XPath 查询中指定完全限定的元素名称
- XPath 无法正常工作.一个>
推荐答案
使用 SelectionNamespaces
是正确的方法,你只是缺少一个命名空间.
Using SelectionNamespaces
is the correct approach, you are just missing a namespace.
请注意,您的 XML 文档显式设置了默认命名空间,如下所示:
Notice that your XML document explicitly sets the default namespace as follows:
xmlns="http://purl.org/rss/1.0/"
这意味着任何没有前缀的元素,例如 item
元素,实际上都在默认命名空间中.因此,如果要使用 XPath 表达式选择该元素,则必须首先设置适当的选择命名空间.
This means that any element without a prefix, such as the item
element, is actually in the default namespace. So if you want to select that element with an XPath expression, you must first set an appropriate selection namespace.
为此,您可以像这样更改对 setProperty
的调用:
To do this, you can change your call to setProperty
like so:
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 表达式应该可以正常工作:
Here you've assigned the default namespace from the document to the rss:
prefix in your XPath expression. With that change in place, the following XPath expression should work correctly:
nodes = doc.selectNodes('/rdf:RDF/rss:item/cb:statistics/cb:exchangeRate/cb:targetCurrency');
之所以有效,是因为它使用正确的命名空间引用了 item
元素.XPath 表达式和原始文档之间的前缀不同这一事实并不重要.前缀绑定到的命名空间才是最重要的.
It works because it references the item
element using the correct namespace. The fact that the prefix differs between the XPath expression and the original document is immaterial. It is the namespace which the prefix is bound to that matters.
这篇关于解析 MSXML 时引用未声明的命名空间前缀的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!