c# - 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" 以及也没有结果。
我不确定我在这里缺少什么。任何帮助表示赞赏。
解决方案
尝试添加一个前缀命名的命名空间,然后引用<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']")
推荐阅读
- python - 使用 python-docx 流式处理生成的 word 文件
- c# - 为什么有时 IEnumerable 中的元素
是可变的,有时它们是不可变的? - .net - Npgsql 在高负载场景下使用 Redshift 的低数据检索性能
- javascript - 如何在 Google Charts Line Graph 中沿 X 轴的一半结束一条线?
- c# - 可以在 C# 代码中安全地使用 Microsoft.VisualBasic 程序集中的 TextFieldParser 和其他类型吗?
- reactjs - 用数组索引反应动态变量名不起作用
- python - pyaes(需要一个类似字节的对象,而不是'str')
- snowflake-cloud-data-platform - SAP Business Objects 4.1 版本是否支持雪花云数据库?
- python - 如何使用 cli 或 boto3 列出 SQS 队列订阅的 SNS 主题?
- algorithm - 验证 BST