问题描述
我正在努力用 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);
}
}