【发布时间】:2012-10-05 06:25:10
【问题描述】:
如何读取/解析 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 作为同一个命名空间的别名。
【问题讨论】:
-
问题是,当然,命名空间存在是有充分理由的,因此您通常在解析 xml 时必须注意它们。然而,有些人通常只是选择去除命名空间——例如,参见stackoverflow.com/questions/987135/…。
-
问题似乎是 AddNamespace() 需要前缀。我假设
"urn:namespace1"在这两种情况下实际上是相同的。使用 XNamespace 可以轻松解决这个问题。你可以使用 XDocument 吗? -
"urn:namespace1" 在这两种情况下都是同一个实例。是的 - 我可以使用 XDocument,但我的文档可能会变得非常大
-
这里的一个误解似乎是 C# 代码中使用的命名空间前缀应该与 XML 中使用的命名空间前缀匹配。这没有必要。
标签: c# .net xml xml-parsing xml-namespaces