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

时间:2011-12-02 23:27:17

标签: c# .net xml xml-namespaces

我有以下示例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。不是我想要的(我想选择“下一步”节点的内容。

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

<Other>SomeValue</Other>

在我的实际场景中,我将XML提供给我,我宁愿不必修改它以关闭命名空间。

有没有办法可以让它与命名空间一起使用?

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

2 个答案:

答案 0 :(得分:5)

您的命名空间声明错误:

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

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

答案 1 :(得分:2)

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

我要发现的是你必须在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);