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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:14:42