如何读取/解析XML名称空间别名未知的XML文档? XML文档的结构和名称空间是已知的,但别名不是。 E.g。
<?xml version="1.0" encoding="utf-8"?>
<Order xmlns:aa="urn:namespace1"
xmlns:bb="urn:namespace2">
<aa:Quantity>1</aa:Quantity>
<bb:Price>9.98</bb:Price>
</Order>
或者
<?xml version="1.0" encoding="utf-8"?>
<Order xmlns:cc="urn:namespace1"
xmlns:dd="urn:namespace2">
<cc:Quantity>1</cc:Quantity>
<dd:Price>9.98</dd:Price>
</Order>
更新:我不知道XML名称空间别名。它们可以是任何东西。
我需要使用AddNameSpace方法为XmlNamespaceManager提供名称空间和别名列表,如下所示:
XPathDocument xDoc = new XPathDocument(“Path to my file”);
XPathNavigator xNav = xDoc.CreateNavigator();
XmlNamespaceManager xmlns = new XmlNamespaceManager(xNav.NameTable);
xmlns.AddNamespace("aa", "urn:namespace1");
xmlns.AddNamespace("bb", "urn:namespace2");
但这不是XML命名空间不可知。我的第二个文档使用cc和dd作为同一名称空间的别名。
答案 0 :(得分:3)
您提供的代码 命名空间不可知,因为源XML中使用的命名空间前缀无关紧要。鉴于您的问题中的命名空间定义,您必须使用XPATH中定义的前缀,例如:您必须使用aa
和bb
。
var quantity = xNav.SelectSingleNode("/Order/aa:Quantity", xmlns);
但是,只要正确使用名称空间cc
和dd
,此代码仍会成功地从使用前缀urn:namespace1
和urn:namespace2
的XML中进行选择。< / p>
为了能够在XPATH中包含名称空间前缀,您必须使用接受IXmlNamespaceResolver
的重载。
重申:使用以下代码定义命名空间时
xmlns.AddNamespace("aa", "urn:namespace1");
您在代码中声明(例如,在您打算使用的XPATH中),您将对名称空间aa
使用名称空间前缀urn:namespace1
。
在要解析的XML中,使用属性分配名称空间:
xmlns:cc="urn:namespace1"
字符串urn:namespace1
与两个地方匹配以使用该特定命名空间非常重要。前缀分别是代码本地和XML文件,不必须匹配。
答案 1 :(得分:0)
文档中使用的命名空间别名无关紧要 - 它们只是文档中使用的别名,可以是该文档的作者在创作该文档时想要使用的任何内容(它们甚至可以更改文档中间)。
要以别名无关的方式访问此文档,只需向XmlNamespaceManager
提供您要使用的别名,然后使用该别名访问该文档,例如
XmlNamespaceManager xmlns = new XmlNamespaceManager(xNav.NameTable);
xmlns.AddNamespace("foo", "urn:namespace1");
xmlns.AddNamespace("bar", "urn:namespace2");
这些别名不需要与文档中使用的别名相匹配 - 这允许您使用foo
和bar
别名对这些名称空间使用XPath表达式无论文档本身使用何种别名,都可以导航文档(只要您提供XmlNamespaceManager
的实例)。