我如何解决
Reference to undeclared namespace prefix: '%s'
Microsoft的msxml实现问题?
我正在使用来自政府网站的XML Feed,其中包含我需要解析的值。 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');
答案 0 :(得分: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"');
在这里,您已将文档中的默认命名空间分配给XPath表达式中的rss:
前缀。通过这种更改,以下XPath表达式应该可以正常工作:
nodes = doc.selectNodes('/rdf:RDF/rss:item/cb:statistics/cb:exchangeRate/cb:targetCurrency');
它有效,因为它使用正确的命名空间引用item
元素。 XPath表达式和原始文档之间的前缀不同这一事实并不重要。重要的是前缀绑定的命名空间。
答案 1 :(得分: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对象
是要走的路
我没有足够的声誉来发表评论。但那一点让我节省了很多时间。
非常感谢
答案 2 :(得分:1)
如果您使用XMLSerializer
并看到此错误,则可能是您遇到此处描述的IE错误:
https://stackoverflow.com/a/11399681
我花了很多时间才意识到这种情况正在发生,所以我认为最好将这两个问题联系起来。