C#使用LINQ解析XML时,如何避免子节点值被拼接并单独获取每个参考编号
C#使用LINQ解析XML时,如何避免子节点值被拼接并单独获取每个参考编号
看起来你碰到了一个挺常见的LINQ to XML小坑——直接取<ReferenceNumbers>节点的Value时,它会把所有子节点的文本内容自动拼接在一起,而不是分别返回每个参考编号。别着急,咱们调整下代码逻辑就能搞定!
问题原因
XElement.Value的特性就是返回该节点下所有层级的文本内容的拼接结果,所以你拿到的自然是两个参考号连在一起的字符串了。咱们要做的不是取父节点的Value,而是遍历父节点下的每个子参考节点,单独获取它们的值。
修改后的代码
这里直接给你调整好的完整代码,你可以直接用:
public class Test { public static void ParseXml(string xml) { var doc = XDocument.Parse(xml); List<KeyValuePair<string, string>> caseList = new List<KeyValuePair<string, string>>(); var t = 1; // 先定位到所有ReferenceNumbers节点(支持多个ReferenceNumbers块的情况) foreach (var refNumbersContainer in doc.Descendants("ReferenceNumbers")) { // 遍历每个ReferenceNumbers下的子节点(也就是各个ReferenceX) foreach (var refNode in refNumbersContainer.Elements()) { caseList.Add(new KeyValuePair<string, string>(t.ToString(), refNode.Value)); t++; } } // 输出结果 foreach (var item in caseList) { Console.WriteLine(item); } } public static void Main() { ParseXml(@"<root> <ReferenceNumbers> <Reference1>CN534786</Reference1> <Reference2>CN476587</Reference2> </ReferenceNumbers> </root>"); } }
关键修改点说明
- 新增了内层循环:先找到
<ReferenceNumbers>容器节点,再遍历它的直接子元素(也就是<Reference1>、<Reference2>这些),这样每个子元素的Value就是单独的参考编号了。 - 把原来的
Insert(0, ...)改成了Add(...),这样结果顺序会和XML里的参考号顺序一致;如果你的业务需要倒序,再改回Insert就行。 - 代码还支持XML里有多个
<ReferenceNumbers>块的情况,比如如果有两组参考号,也能全部遍历到。
运行结果
修改后运行代码,就能得到你想要的输出:
[1, CN534786] [2, CN476587]
额外提一句:如果你的XML里可能存在非参考编号的子节点,还可以加个过滤条件,只取名称以Reference开头的节点,比如:
foreach (var refNode in refNumbersContainer.Elements().Where(e => e.Name.LocalName.StartsWith("Reference")))
备注:内容来源于stack exchange,提问作者jwdickins
相关产品推荐
相关产品推荐

