C#遍历XML中NASPATH_LOC下NASPATH子节点失败,获取节点返回Null求助
解决C#遍历XML中节点返回Null的问题
我帮你排查了下代码和XML配置的问题,主要有几个关键点导致你无法获取到目标节点,下面是具体的问题分析和修复方案:
问题分析
- XPath路径缺失根节点:你的XML文档根节点是
<Config>,但代码里的SelectNodes使用的路径是/GetPollingIndexDetails/NASPATH_LOC/NASPATH,没有包含根节点,导致XPath无法匹配到任何元素,直接返回null。 - foreach语句末尾多余分号:
foreach (XmlNode xn in xnList);这里的分号会让循环体变成空语句,后面的代码块不会参与循环,即使找到了节点也无法正确遍历。 - 全局XPath获取子节点值:你调用
logwritter.GetMessage时使用的是全局XPath,这样每次都会返回第一个<NASPATH>节点的内容,而不是当前遍历的节点下的对应值,完全失去了遍历的意义。
修复后的代码
_xmlConfigPath = Convert.ToString(ConfigurationManager.AppSettings["ConfigXML"]); XmlDocument xmlNasNode = new XmlDocument(); xmlNasNode.Load(_xmlConfigPath); // 修正XPath,添加根节点Config XmlNodeList xnList = xmlNasNode.SelectNodes("/Config/GetPollingIndexDetails/NASPATH_LOC/NASPATH"); // 去掉foreach末尾的分号 foreach (XmlNode xn in xnList) { // 基于当前遍历的xn节点获取子节点值,避免全局XPath的问题 string NASPath = xn.SelectSingleNode("./NASPath").InnerText; string NASUserId = xn.SelectSingleNode("./NASUserId").InnerText; string UserDomain = xn.SelectSingleNode("./UserDomain").InnerText; string NASUserPwd = xn.SelectSingleNode("./NASUserPwd").InnerText; int LoginType = Convert.ToInt32(xn.SelectSingleNode("./LoginType").InnerText); // 这里可以添加你的业务逻辑,比如处理获取到的每个NASPATH节点数据 }
额外说明
如果你必须使用logwritter.GetMessage方法,需要确认这个方法是否支持基于指定XmlNode的查询。如果它只能接收全局XPath和文件路径,那你需要修改这个方法,或者在遍历的时候通过当前节点的索引构造精准XPath(比如/Config/GetPollingIndexDetails/NASPATH_LOC/NASPATH[1]这样的索引式路径),不过更推荐直接使用XmlNode的SelectSingleNode方法来获取当前节点的子元素,这样更高效且不易出错。
内容的提问来源于stack exchange,提问作者user14956888
相关产品推荐
相关产品推荐

