XML命名空间别名与.NET XML阅读器/解析无关

时间:2012-10-15 09:37:57

标签: c# .net xml xml-parsing xml-namespaces

如何读取/解析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作为同一名称空间的别名。

2 个答案:

答案 0 :(得分:3)

您提供的代码 命名空间不可知,因为源XML中使用的命名空间前缀无关紧要。鉴于您的问题中的命名空间定义,您必须使用XPATH中定义的前缀,例如:您必须使用aabb

var quantity = xNav.SelectSingleNode("/Order/aa:Quantity", xmlns);

但是,只要正确使用名称空间ccdd,此代码仍会成功地从使用前缀urn:namespace1urn: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");

这些别名不需要与文档中使用的别名相匹配 - 这允许您使用foobar别名对这些名称空间使用XPath表达式无论文档本身使用何种别名,都可以导航文档(只要您提供XmlNamespaceManager的实例)。