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
相关产品推荐
相关产品推荐

