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

带命名空间与重复节点的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:43:17