带命名空间与重复节点的XML读取:获取UzdProd下指定节点值
解决XML中UzdProd节点下重复子节点的取值问题
看起来你之前的代码大概率在节点选择或遍历逻辑上出了问题,导致只能拿到最后一组值或者取不到UzdProd下的内容。我给你两种常用的C#处理XML的方案,都能正确获取UzdProd下所有NKODS、F_DAUDZ和DAUDZ的值:
方法一:使用XmlDocument(传统DOM方式)
先假设你的XML结构大概是这样的(如果实际结构有出入,调整节点路径即可):
<Root> <UzdMat> <NKODS>Mat_001</NKODS> <F_DAUDZ>20</F_DAUDZ> <DAUDZ>10</DAUDZ> </UzdMat> <UzdProd> <NKODS>Prod_001</NKODS> <F_DAUDZ>100</F_DAUDZ> <DAUDZ>50</DAUDZ> </UzdProd> <UzdProd> <NKODS>Prod_002</NKODS> <F_DAUDZ>200</F_DAUDZ> <DAUDZ>150</DAUDZ> </UzdProd> </Root>
对应的C#代码:
using System.Xml; // 加载XML文件(也可以用LoadXml加载字符串) XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("你的XML文件路径.xml"); // 选中所有UzdProd节点(用//表示从根节点开始查找所有匹配的节点) XmlNodeList uzdProdNodes = xmlDoc.SelectNodes("//UzdProd"); // 遍历每个UzdProd节点,提取子节点值 foreach (XmlNode prodNode in uzdProdNodes) { // 用?.避免节点不存在时的空引用异常,??给默认空字符串 string nkods = prodNode.SelectSingleNode("NKODS")?.InnerText ?? string.Empty; string fDaudz = prodNode.SelectSingleNode("F_DAUDZ")?.InnerText ?? string.Empty; string daudz = prodNode.SelectSingleNode("DAUDZ")?.InnerText ?? string.Empty; // 这里可以把值存入集合或者做其他处理 Console.WriteLine($"UzdProd: NKODS={nkods}, F_DAUDZ={fDaudz}, DAUDZ={daudz}"); }
方法二:使用LINQ to XML(更简洁的方式)
如果你用的是.NET Framework 3.5及以上,LINQ to XML会更直观:
using System.Xml.Linq; // 加载XML文档 XDocument xDoc = XDocument.Load("你的XML文件路径.xml"); // 查询所有UzdProd节点并提取子节点值 var prodValues = from prodNode in xDoc.Descendants("UzdProd") select new { NKODS = prodNode.Element("NKODS")?.Value ?? string.Empty, F_DAUDZ = prodNode.Element("F_DAUDZ")?.Value ?? string.Empty, DAUDZ = prodNode.Element("DAUDZ")?.Value ?? string.Empty }; // 遍历结果 foreach (var item in prodValues) { Console.WriteLine($"UzdProd: NKODS={item.NKODS}, F_DAUDZ={item.F_DAUDZ}, DAUDZ={item.DAUDZ}"); }
你之前可能踩的坑
- 错误使用SelectSingleNode:如果之前用了
xmlDoc.SelectSingleNode("//UzdProd"),只会拿到第一个UzdProd节点,而不是所有,必须用SelectNodes来获取节点列表。 - 节点路径错误:如果XML有命名空间,需要额外处理命名空间(比如上面代码里如果有xmlns属性,要添加命名空间管理器)。
- 遍历逻辑错误:之前可能循环的是UzdMat节点,而不是UzdProd,或者没有从UzdProd节点内部去查找子节点,导致拿到的还是UzdMat下的值。
如果你的XML带有命名空间,比如<Root xmlns="http://your-namespace.com">,那需要调整代码:
- 对于XmlDocument,要添加
XmlNamespaceManager:
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable); nsMgr.AddNamespace("ns", "http://your-namespace.com"); XmlNodeList uzdProdNodes = xmlDoc.SelectNodes("//ns:UzdProd", nsMgr); // 子节点也要加命名空间前缀:prodNode.SelectSingleNode("ns:NKODS", nsMgr)
- 对于LINQ to XML,要声明命名空间:
XNamespace ns = "http://your-namespace.com"; var prodValues = from prodNode in xDoc.Descendants(ns + "UzdProd") select new { NKODS = prodNode.Element(ns + "NKODS")?.Value ?? string.Empty, // 其他节点同理 };
内容的提问来源于stack exchange,提问作者WhizBoy
相关产品推荐
相关产品推荐

