使用C# XDocument解析XML时如何读取Phone子树节点内容
提取节点下子结构的操作方法
核心逻辑
你当前循环拿到的addresList就是每个<Info>节点的XElement对象,取它的下级子树内容和你现在取同级基础字段的逻辑完全一致,只需要从当前节点出发逐级向下定位即可,不需要特殊的API。
步骤说明
- 第一步:从当前
Info节点获取直属的<Phone>子节点引用 - 第二步:从拿到的
Phone节点引用出发,和你取AddressLine1、City字段一样,调用.Element("节点名")读取对应子元素的文本值
注意事项
- 你贴的示例XML存在标签匹配错误:
<Phone>下的三个子元素开标签分别是<dataAsString1>、<dataAsString2>、<dataAsString3>,但闭合标签全部误写为</string>,实际加载时会触发XML格式异常,需要先修正这几处闭合标签才能正常解析。 - 取值前建议对
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
相关产品推荐
相关产品推荐

