微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用定义的 xmlns 标记但不使用命名空间解析 XML 文件

如何解决使用定义的 xmlns 标记但不使用命名空间解析 XML 文件

我正在努力用 XPathDocument 解析 XPathNavigator,其中 XML 文档包含 xmlns 标记,但没有使用命名空间前缀。

<?xml version="1.0" encoding="UTF-8"?>
<Order version="1" xmlns="http://example.com">
    <Data>
        <Id>1</Id>
        <b>Aaa</b>
    </Data>
</Order>

SelectSingleNode 方法需要定义了命名空间的命名空间管理器。

XmlNamespaceManager nsmgr = new XmlNamespaceManager(nav.NaMetable);
nsmgr.AddNamespace("ns","http://example.com");

因此,我必须开始在所有 XPath 表达式中使用 ns 前缀,尽管原始 XML 文件不使用前缀,例如:

nav.SelectSingleNode("/ns:Order/ns:Data/ns:Id",nsmgr)

增加了不必要的复杂性。

有没有办法推动 XPathNavigator 忽略命名空间及其前缀?至少不要使用前缀,因为命名空间定义本身只存在一次,所以不需要太多努力

解决方法

XML 有一个默认的命名空间。因此,每个 XML 元素都绑定到它,无论是否可见。

最好使用 LINQ to XML

它是首选的 XML API,自 2007 年起在 .Net Framework 中可用。

c#

void Main()
{
    XDocument xdoc = XDocument.Parse(@"<Order version='1' xmlns='http://example.com'>
            <Data>
                <Id>1</Id>
                <b>Aaa</b>
            </Data>
        </Order>");

    XNamespace ns = xdoc.Root.GetDefaultNamespace();

    foreach (XElement elem in xdoc.Descendants(ns + "Data"))
    {
        Console.WriteLine("ID: {0},b: {1}",elem.Element(ns + "Id")?.Value,elem.Element(ns + "b")?.Value);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。