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

XmlNode遍历问题:获取产品节点关联属性返回空文本

修复XML遍历中产品属性关联的问题

给定XML

<o name="" type="product.567" id="5">
 <pl>
  <p name="product.articleNumber">413221</p>            
  <p name="product.width">2.200</p>
 </pl>
</o>
<o name="" type="product.678" id="6">
 <pl>
  <p name="product.articleNumber">1233123</p>       
  <p name="product.width">8.199</p>
 </pl>
</o>    

需求

选中所有<o>产品节点,遍历过程中获取每个产品对应的articleNumber和width值,确保属性与所属产品一一关联,而非批量获取所有属性值。

尝试代码

加载XML并获取产品节点列表

XmlDocument doc = new XmlDocument();
doc.Load("File.xml");

XmlNodeList klvNdList = doc.SelectNodes("//o");

遍历节点获取属性的代码(存在问题)

foreach(XmlNode klv in klvNdList)
{
 XmlNode child = klv.SelectSingleNode("//p[@name='product.articleNumber']");
 string theThingIWant = child.InnerText;
}

问题

上述遍历代码无法正常运行,返回空文本。


解决方案

错误原因

XPath表达式中的//是从文档根节点开始递归搜索,而非从当前klv节点的子节点开始查找。这会导致每次都返回文档中第一个匹配的<p>节点,甚至当当前节点下没有匹配项时返回空,引发空引用错误。

修正后的代码

使用相对路径的XPath,从当前节点的子节点开始搜索:

foreach(XmlNode klv in klvNdList)
{
    // 使用.//表示从当前节点开始递归搜索子节点
    XmlNode articleNode = klv.SelectSingleNode(".//p[@name='product.articleNumber']");
    XmlNode widthNode = klv.SelectSingleNode(".//p[@name='product.width']");
    
    // 避免空引用,先检查节点是否存在
    if(articleNode != null && widthNode != null)
    {
        string articleNumber = articleNode.InnerText;
        string width = widthNode.InnerText;
        // 后续处理逻辑,比如输出或存储
        Console.WriteLine($"产品ID: {klv.Attributes["id"].Value}, 货号: {articleNumber}, 宽度: {width}");
    }
}

更精准的路径写法

如果XML结构固定(<o>下必含<pl>,<pl>下才是<p>节点),可以用更精确的XPath提升效率:

XmlNode articleNode = klv.SelectSingleNode("pl/p[@name='product.articleNumber']");
XmlNode widthNode = klv.SelectSingleNode("pl/p[@name='product.width']");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:39:40