You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何读取XML节点中的单个项?附目标XML示例

C#读取带命名空间的XML节点(SenderKey、RecipientKey等)

我来分享两种在C#里读取这个带命名空间XML节点的实用方法,毕竟这个XML用到了两个不同的命名空间,处理的时候得留意这点,不然容易找不到节点~

先把你的XML示例贴出来方便参考:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SENT_110 xmlns:ns2="http://www.mf.gov.pl/SENT/2017/01/18/STypes.xsd" xmlns="http://www.mf.gov.pl/SENT/2017/01/18/SENT_110.xsd">
  <SentNumber>SENT20180416000032</SentNumber>
  <KeyNumber>
    <ns2:SenderKey>KS-28YM</ns2:SenderKey>
    <ns2:RecipientKey>KR-52DH</ns2:RecipientKey>
    <ns2:CarrierKey>KD-48WW</ns2:CarrierKey>
  </KeyNumber>
</SENT_110>

方法一:使用 XmlDocument(传统DOM方式)

这种方法适合习惯用DOM操作的场景,核心是正确管理命名空间,因为XML里既有默认命名空间,又有ns2前缀的命名空间,必须声明后才能准确定位节点。

using System.Xml;

// 假设XML内容是字符串形式,也可以从文件加载
string xmlContent = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
<SENT_110 xmlns:ns2=""http://www.mf.gov.pl/SENT/2017/01/18/STypes.xsd"" xmlns=""http://www.mf.gov.pl/SENT/2017/01/18/SENT_110.xsd"">
  <SentNumber>SENT20180416000032</SentNumber>
  <KeyNumber>
    <ns2:SenderKey>KS-28YM</ns2:SenderKey>
    <ns2:RecipientKey>KR-52DH</ns2:RecipientKey>
    <ns2:CarrierKey>KD-48WW</ns2:CarrierKey>
  </KeyNumber>
</SENT_110>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlContent);

// 创建命名空间管理器,添加两个命名空间的声明
XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable);
nsManager.AddNamespace("sent", "http://www.mf.gov.pl/SENT/2017/01/18/SENT_110.xsd"); // 默认命名空间
nsManager.AddNamespace("ns2", "http://www.mf.gov.pl/SENT/2017/01/18/STypes.xsd");    // ns2前缀对应的命名空间

// 读取目标节点的文本内容
string senderKey = doc.SelectSingleNode("//sent:SENT_110/sent:KeyNumber/ns2:SenderKey", nsManager)?.InnerText;
string recipientKey = doc.SelectSingleNode("//sent:SENT_110/sent:KeyNumber/ns2:RecipientKey", nsManager)?.InnerText;
string carrierKey = doc.SelectSingleNode("//sent:SENT_110/sent:KeyNumber/ns2:CarrierKey", nsManager)?.InnerText;

// 输出结果
Console.WriteLine($"SenderKey: {senderKey}");
Console.WriteLine($"RecipientKey: {recipientKey}");
Console.WriteLine($"CarrierKey: {carrierKey}");

方法二:使用 LINQ to XML(XDocument,更简洁)

LINQ to XML是.NET里更现代的XML处理方式,代码更简洁直观,同样需要正确处理命名空间。

using System.Xml.Linq;

string xmlContent = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
<SENT_110 xmlns:ns2=""http://www.mf.gov.pl/SENT/2017/01/18/STypes.xsd"" xmlns=""http://www.mf.gov.pl/SENT/2017/01/18/SENT_110.xsd"">
  <SentNumber>SENT20180416000032</SentNumber>
  <KeyNumber>
    <ns2:SenderKey>KS-28YM</ns2:SenderKey>
    <ns2:RecipientKey>KR-52DH</ns2:RecipientKey>
    <ns2:CarrierKey>KD-48WW</ns2:CarrierKey>
  </KeyNumber>
</SENT_110>";

XDocument doc = XDocument.Parse(xmlContent);

// 定义两个命名空间
XNamespace sentNs = "http://www.mf.gov.pl/SENT/2017/01/18/SENT_110.xsd";
XNamespace stypesNs = "http://www.mf.gov.pl/SENT/2017/01/18/STypes.xsd";

// 通过LINQ查询目标节点
string senderKey = doc.Descendants(sentNs + "KeyNumber")
                      .Elements(stypesNs + "SenderKey")
                      .FirstOrDefault()?.Value;

string recipientKey = doc.Descendants(sentNs + "KeyNumber")
                         .Elements(stypesNs + "RecipientKey")
                         .FirstOrDefault()?.Value;

string carrierKey = doc.Descendants(sentNs + "KeyNumber")
                       .Elements(stypesNs + "CarrierKey")
                       .FirstOrDefault()?.Value;

// 输出结果
Console.WriteLine($"SenderKey: {senderKey}");
Console.WriteLine($"RecipientKey: {recipientKey}");
Console.WriteLine($"CarrierKey: {carrierKey}");

小提示

如果你的XML是从本地文件读取的,只需要把XmlDocument.LoadXml换成XmlDocument.Load("你的文件路径"),把XDocument.Parse换成XDocument.Load("你的文件路径")就可以了。

内容的提问来源于stack exchange,提问作者miszczu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:06:22