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

C#遍历XmlNode为对象赋值时始终读取首个节点值问题排查

问题根因

问题由XPath表达式的全局匹配规则导致:
XPath中以//开头的表达式会忽略当前上下文节点,直接从整个XML文档的根节点开始搜索匹配节点。所以无论循环中当前遍历到哪个note节点,调用SelectSingleNode("//pitch/step")都会返回文档中第一个符合条件的step节点,也就是值为E的节点,最终所有对象的Step和Octave都被赋值为第一个节点的对应值。

解决方案

将循环内的XPath表达式改为相对当前节点的匹配规则即可:
删除XPath开头的//,直接写子节点路径,代表从当前note节点的子节点中查找匹配项,修改后的循环代码如下:

foreach (XmlNode node in noteNodes)
{
    Note note = new Note();
    note.Sequence = sequence++;
    // 使用相对路径从当前node下查找子节点
    note.Step = node.SelectSingleNode("pitch/step").InnerText;
    note.Octave = node.SelectSingleNode("pitch/octave").InnerText;
    notes.Add(note);
}

也可以显式添加.代表当前节点,写法为./pitch/step,效果完全一致。

修改后运行结果

[0] E 3
[1] D 5
[2] B 7

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:36:03