如何读取具有名称空间的XPathDocument

本文关键字:有名称 空间 XPathDocument 何读取 读取 | 更新日期: 2023-09-27 18:16:26

我有以下示例XML文件:

<Top xmlns="abbr:SomeNSValue">
  <Next>
    <Other>SomeValue</Other>
  </Next>
</Top>

我加载它,试着这样读:

FileStream stream = new FileStream(@".'TestXML.xml", FileMode.Open);
XPathDocument xPathDocument = new XPathDocument(stream);
XPathNavigator navigator = xPathDocument.CreateNavigator();
XmlNamespaceManager ns = null;
if (navigator.NameTable != null)
{
    ns = new XmlNamespaceManager(navigator.NameTable);
    ns.AddNamespace("abbr", "SomeNSValue");
}
XPathNodeIterator iterator = navigator.Select("/Top/Next", ns);
iterator.MoveNext();
Console.WriteLine(iterator.Current.InnerXml);

输出上面显示的完整XML。不是我要找的(我想选择"下一个"节点的内容。

但是如果我把xmlns="abbr:SomeNSValue从XML中取出,然后再试一次,那么我就得到了我想要的:

<Other>SomeValue</Other>

在我的实际场景中,我有XML提供给我,我宁愿不修改它来删除名称空间。

是否有一种方法可以使这个工作与其中的名称空间?

注意:这是我在我的XML文件中实际的名称空间:xmlns="urn:hl7-org:v2xml"

如何读取具有名称空间的XPathDocument

您的命名空间声明错误:

<Top xmlns:abbr="SomeNSValue">
  <Next>
    <Other>SomeValue</Other>
  </Next>
</Top>

当你做这个神奇的改变,你的代码的其余部分工作:)..

古老的问题,但我偶然发现这个从谷歌试图找出类似的东西。所以这里有一个答案,可能会帮助其他人从谷歌。

我发现必须在XPath表达式中指定名称空间前缀(尽管XML文件中没有名称空间前缀)。

ns.AddNamespace("foo", "urn:hl7-org:v2xml"); // make up whatever prefix you want here

,后来:

XPathNodeIterator iterator = navigator.Select("/foo:Top/foo:Next", ns);