gpt4 book ai didi

c# - XML 命名空间别名不可知 .NET XML 读取器/解析

转载 作者:行者123 更新时间:2023-11-30 22:24:13 25 4
gpt4 key购买 nike

如何读取/解析 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 namespace 不可知论者。我的第二个文档使用 cc 和 dd 作为同一个命名空间的别名。

最佳答案

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

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

但是,只要命名空间 urn:namespace1,此代码仍会成功地从使用前缀 ccdd 的 XML 中进行选择和 urn:namespace2 被正确使用。

为了能够在 XPATH 中包含 namespace 前缀,您必须使用接受 IXmlNamespaceResolver 的重载.

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

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

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

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

xmlns:cc="urn:namespace1"

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

关于c# - XML 命名空间别名不可知 .NET XML 读取器/解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12892922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com