You need to enable JavaScript to run this app. 使用C# XDocument解析XML时如何读取Phone子树节点内容
优惠活动
大模型
产品
解决方案
定价
更多

使用C# XDocument解析XML时如何读取Phone子树节点内容

提取节点下子结构的操作方法

核心逻辑

你当前循环拿到的addresList就是每个<Info>节点的XElement对象,取它的下级子树内容和你现在取同级基础字段的逻辑完全一致,只需要从当前节点出发逐级向下定位即可,不需要特殊的API。

步骤说明

  • 第一步:从当前Info节点获取直属的<Phone>子节点引用
  • 第二步:从拿到的Phone节点引用出发,和你取AddressLine1、City字段一样,调用.Element("节点名")读取对应子元素的文本值

注意事项

  1. 你贴的示例XML存在标签匹配错误:<Phone>下的三个子元素开标签分别是<dataAsString1>、<dataAsString2>、<dataAsString3>,但闭合标签全部误写为</string>,实际加载时会触发XML格式异常,需要先修正这几处闭合标签才能正常解析。
  2. 取值前建议对Phone节点做判空处理,避免部分<Info>节点缺失<Phone>子元素时抛出空引用异常。

改造后的完整代码片段

XDocument xdoc = XDocument.Load("1.xml");
foreach (XElement addresList in xdoc.Document.Element("data").Elements("Infos").Elements("Info"))           
{
     address = new Address();
     // 原有基础字段取值逻辑保持不变
     address.id = (string)addresList.Element("AddressFk");
     address.Line1 = (string)addresList.Element("AddressLine1");
     address.Line2 = (string)addresList.Element("AddressLine2");
     address.City = (string)addresList.Element("City");

     // 新增Phone子树取值逻辑
     XElement phoneNode = addresList.Element("Phone");
     if (phoneNode != null)
     {
         // 逐次读取Phone下的子字段,写法和读取Info下的字段完全一致
         address.Phone1 = (string)phoneNode.Element("dataAsString1");
         address.Phone2 = (string)phoneNode.Element("dataAsString2");
         address.Phone3 = (string)phoneNode.Element("dataAsString3");
     }
}

可选简化写法

如果不想逐层级写.Element(),可以直接从当前Info节点用Descendants方法跨层级定位目标节点,比如读取dataAsString1的写法可以简化为:

address.Phone1 = (string)addresList.Descendants("dataAsString1").FirstOrDefault();

这种写法不需要关心目标节点和当前节点之间隔了几层父元素,只要当前子树内存在对应名称的节点就能取到值,缺点是如果子树内存在重名节点,会默认返回第一个匹配项,需要注意结构匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 03:54:06