2

如何读取/解析 XML 命名空间别名未知的 XML 文档?XML 文档的结构和名称空间是已知的,但别名不知道。例如

<?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 作为同一个命名空间的别名。

4

2 回答 2

3

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

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

但是,只要名称空间和正确使用,此代码仍将成功地从 XML 中选择前缀cc和使用的位置。ddurn:namespace1urn:namespace2

为了能够在 XPATH 中包含命名空间前缀,您必须使用接受IXmlNamespaceResolver.

重申:当您使用以下代码定义命名空间时

xmlns.AddNamespace("aa", "urn:namespace1");

您声明在您的代码中(例如,在您打算使用的 XPATH 中)您将使用 namespace 前缀aa作为 namespace urn:namespace1

在要解析的 XML 中,使用属性分配命名空间:

xmlns:cc="urn:namespace1"

字符串urn:namespace1匹配两个地方以使用该特定命名空间是很重要的。前缀分别是您的代码和 XML 文件的本地前缀,它们不必匹配。

于 2012-10-15T10:03:15.113 回答
0

文档中使用的命名空间别名无关紧要 - 它们只是文档中使用的别名,可以是该文档的作者在创作该文档时想要使用的任何名称(它们甚至可以更改中间文档)。

要以与别名无关的方式访问此文档,只需提供您想要使用的任何别名XmlNamespaceManager,然后使用该别名来访问该文档,例如

XmlNamespaceManager xmlns = new XmlNamespaceManager(xNav.NameTable);
xmlns.AddNamespace("foo", "urn:namespace1");
xmlns.AddNamespace("bar", "urn:namespace2");

这些别名不需要与文档中使用的别名相匹配- 这样您就可以使用 XPath 表达式使用这些命名空间的foobar别名来导航文档,而不管文档本身使用的别名如何(只要您提供)的实例XmlNamespaceManager

于 2012-10-15T10:15:04.910 回答