首页 > 解决方案 > C#选择节点没有找到节点

问题描述

我确定我在这里遗漏了一些简单的东西,但我已经为此苦苦挣扎了几天。我希望有人能指出我所缺少的。

我从外部来源收到以下简化格式的 XML 消息:

<root>
  <A>
    <B xmlns="http://www.something.com/Document>
      <C>Value1</C> 
      <D>Value2</D>
      <E>Value3</E>
    </B>
  </A>
  <A>
    <B xmlns="http://www.something.com/Document>
      <D>Value5</D>
      <E>Value6</E>
    </B>
  </A>
</root>

我正在尝试提取 D 元素。

我试过了:

XmlNodeList xmlResults = xdPayload.SelectNodes("//D")

这没有返回任何结果。然后认为命名空间是我尝试过的问题:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdPayload.NameTable);
xnlResults = xdPayload.SelectNodes("//D", nsmgr);

再次没有结果。我不认为我需要添加默认命名空间,但是当认为聪明不起作用时会觉得愚蠢。所以我尝试了这个:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdPayload.NameTable);
nsmgr.AddNamespace("", "http://www.something.com/Document");
xnlResults = xdPayload.SelectNodes("//D", nsmgr);

仍然没有结果。我已经尝试过更具描述性的 XPath,例如 "/root/A/B/D" 和 "/root/A/B[@xmlns="http://www.somewhere.com/Document"]/D" 以及也没有结果。

我不确定我在这里缺少什么。任何帮助表示赞赏。

标签: c#xmlxpath

解决方案


尝试添加一个前缀命名的命名空间,然后引用<D>as ns0:D

NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
nsmgr.AddNamespace("ns0", "http://www.something.com/Document");
xnlResults = xdPayload.SelectNodes("/root/A/ns0:B/ns0:D", nsmgr);

这应该为您选择<D>要进一步处理的元素。


如果这不起作用,您将始终可以选择忽略所有命名空间,例如

XmlNodeList xmlResults = xdPayload.SelectNodes("//*[local-name()='D']")

推荐阅读