foreach循环结合SelectSingleNode始终返回首个节点,无法逐个获取Domain节点文本
解决XmlDocument提取单个Domain节点文本的问题
我太懂你这种明明觉得逻辑没问题,但结果就是不对的抓狂感!从你描述的情况来看,核心问题应该是你误取了父节点的文本内容,或者XPath选择器没精准定位到单个<domain>节点,导致所有节点的文本被拼接在一起了。
先分析常见错误原因
比如你的XML结构大概率是类似这样的:
CorpDomain MyDomain aaaa
如果直接取<domains>节点的InnerText,会直接把所有子节点的文本拼接成"CorpDomainMyDomainaaaa";如果XPath写错(比如只选到了某个父节点),就会只拿到部分文本。
正确的XmlDocument实现代码
你需要精准定位到每个<domain>节点,然后逐个提取文本:
// 假设已经将HTTP响应保存为xmlString字符串 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlString); // 用XPath选择所有<domain>节点,//表示遍历所有层级,也可以写更精确的路径比如/root/domains/domain XmlNodeList domainNodes = xmlDoc.SelectNodes("//domain"); List<string> domainList = new List<string>(); foreach (XmlNode domainNode in domainNodes) { // 每个节点单独取InnerText,再Trim掉可能的空白字符 domainList.Add(domainNode.InnerText.Trim()); } // 现在domainList里就是每个独立的域名了 foreach (string domain in domainList) { Console.WriteLine(domain); }
更简洁的替代方案:LINQ to XML
如果你的项目支持,用LINQ to XML会更直观,不容易出错:
XDocument xDoc = XDocument.Parse(xmlString); List<string> domainList = xDoc.Descendants("domain") .Select(node => node.Value.Trim()) .ToList();
额外注意事项
- 如果你的XML带有命名空间,那XPath需要加上命名空间管理器,不然会选不到节点;
- 检查XML里的
<domain>节点是否有嵌套子节点,如果有,InnerText还是会拼接子节点的文本,这时候可能需要用FirstChild.InnerText或者更精准的选择; - 尽量用精确的XPath路径(比如
/root/domains/domain)代替//domain,避免误选到其他层级的同名节点。
内容的提问来源于stack exchange,提问作者Hammertime
相关产品推荐
相关产品推荐

