如何从XML元素中获取子元素数组?解决多outflow取值不全问题
解决LINQ获取XML中多个outflow元素的问题
首先来看你的XML结构:
<stock name="Fish"> <eqn>100</eqn> <inflow>Spawns</inflow> <outflow>Deaths</outflow> <outflow>Flow_1</outflow> <non_negative/> </stock>
你原来的代码里,q.Element(ns + "outflow").Value只会抓取第一个匹配的<outflow>元素,这就是为什么只能拿到Deaths而漏掉Flow_1的原因——Element()方法本身就只返回第一个符合条件的元素。
要把所有outflow都存到数组里,你需要用Elements()方法(注意末尾的s)来获取所有匹配的元素集合,再转成数组。修改后的代码如下:
var stockList = from q in variable.Descendants(ns + "stock") select new { name = q.FirstAttribute.Value, initial = q.Element(ns + "eqn").Value, inflow = q.Element(ns + "inflow")?.Value, // 空值检查防止无inflow时出错 outflows = q.Elements(ns + "outflow").Select(e => e.Value).ToArray() };
关键修改点说明:
Elements(ns + "outflow"):替代原来的Element(),获取当前<stock>节点下所有的<outflow>子元素Select(e => e.Value):遍历每个<outflow>元素,提取它的文本内容ToArray():把提取到的所有outflow值转换成字符串数组,方便后续的存储和遍历使用
另外给inflow加了?.Value的空值运算符,这样如果某个<stock>节点没有<inflow>元素时,不会抛出空引用异常,代码会更健壮。
如果要验证结果,可以这样遍历输出:
foreach (var stock in stockList) { Console.WriteLine($"Stock: {stock.name}"); Console.WriteLine($"Initial: {stock.initial}"); Console.WriteLine($"Inflow: {stock.inflow ?? "No inflow defined"}"); Console.WriteLine("Outflows:"); foreach (var outflow in stock.outflows) { Console.WriteLine($" - {outflow}"); } }
运行后就能看到两个outflow都被正确获取到了。
内容的提问来源于stack exchange,提问作者Jake freise
相关产品推荐
相关产品推荐

