如何用C#从含通用标签的XML中根据指定条目获取整组记录?
修正方案:从通用标签XML中提取目标ROW的所有ENT值
我来帮你搞定这个问题,先拆解下原代码的几个关键问题,再给出修正后的实现:
原代码的核心问题
- 定位元素错误:你直接在
XDocument上调用Where,但根节点是<Note>,应该先定位到所有<ROW>元素; - 检查条件失效:
r.Element("ENT")只会拿到当前ROW下的第一个<ENT>,根本没法检查整个ROW里是否包含"Purple"; - 值提取重复且错误:你反复取第一个ENT的Value,导致所有value字段都是同一个值,完全没遍历所有ENT;
- 空元素处理缺失:空的
<ENT/>直接访问.Value会抛出NullReferenceException,必须安全处理这种情况。
修正后的完整代码
using System; using System.Linq; using System.Xml.Linq; namespace ParseGenericXML { class Program { static void Main(string[] args) { XDocument document = XDocument.Load("thisxml.xml"); // 第一步:找到包含值为"Purple"的ENT元素的目标ROW var targetRow = document.Descendants("ROW") .FirstOrDefault(row => row.Elements("ENT") .Any(ent => (string)ent == "Purple")); if (targetRow != null) { // 第二步:提取当前ROW下所有ENT的值,空元素自动转为null var entValues = targetRow.Elements("ENT") .Select(ent => (string)ent) // 强转XElement为string会自动处理空元素为null .ToArray(); // 验证输出结果 Console.WriteLine("结果:"); foreach (var val in entValues) { Console.WriteLine(val ?? "null"); } // 预期输出顺序:right, High, Purple, null, High } else { Console.WriteLine("未找到包含Purple的ROW"); } } } }
关键逻辑说明
- 定位目标ROW:用
Descendants("ROW")获取所有ROW元素,然后通过Any检查该ROW下是否存在值为"Purple"的ENT。这里直接把XElement强转为string,比用.Value更安全——空元素会自动返回null,不会报错。 - 提取所有ENT值:遍历目标ROW下的所有ENT元素,同样通过强转的方式获取值,得到的数组就是你想要的
{"right","High","Purple",null,"High"}。 - 空值安全处理:判断
targetRow是否为null,避免找不到匹配项时出现空引用错误。
内容的提问来源于stack exchange,提问作者user3250152
相关产品推荐
相关产品推荐

