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

