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

