繁体   English   中英

如何在C#中使用LINQ读取Xml文件

[英]How to read Xml File Using LINQ in C#

我有一个XML文件,例如

<root>
  <Child val1="1" val2="2"/>
  <Child val1="3" val2="4"/>
  <Child val1="5" val2="6"/>
  <Child val1="7" val2="8"/>
  <Child val1="9" val2="10"/>
  <Child val1="11" val2="12"/>
  <Child val1="13" val2="14"/>
</root>

我需要将val1val2的属性值读取到List<String>

结果列表将包含

{ "1" , "2" , "3" , ........ ,"13" , "14" }

这是我的示例代码:

XDocument XD = XDocument.Load(Application.StartupPath + "\\foo.xml");
List<String> l_lstTemp = XD.Descendants("Child")
                           .Select(X => new List<String> { X.Attribute("val1").Value,
                                                           X.Attribute("val2").Value })
                           .SelectMany(X => X)
                           .Distinct()
                           .ToList();

有什么办法可以使用Select而不是selectMany来做到这一点?

如何修改我现有的expression

SelectMany正是在这里您想要做的-将结果从一系列字符串列表展平为单个字符串序列。 您为什么要采用能准确表达所需内容的工作代码并进行更改?

诚然,您可以通过使用SelectMany稍有不同来简化它,并使用数组而不是列表来简化它:

XDocument doc = XDocument.Load(Application.StartupPath + "\\foo.xml");
List<String> values = doc.Descendants("Child")
                         .SelectMany(x => new[] { x.Attribute("val1").Value,
                                                  x.Attribute("val2").Value })
                         .Distinct()
                         .ToList();

您的问题场景正是SelectMany所能解决的,因此我认为我们为消除该问题可能会做的任何事情都会使事情复杂化。 :)

最初的.Select返回IEnumerable的结果,如果没有.SelectMany,我们将得到:

{
 IEnumerable<string> [ "1", "2" ]
 IEnumerable<string> [ "3", "4" ]
 etc...
}

.SelectMany使用一个IEnumerable会将初始结果“展平”到另一个IEnumerable中,从而为您提供所需的内容:

{
 IEnumerable<string> [ "1", "2", "3", "4" ]
}

这是一篇很棒的文章,更好地描述了LINQ SelectMany运算符的外观

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM