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

时间:2010-12-24 14:04:20

标签: c# xml linq lambda

我有一个像

这样的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

2 个答案:

答案 0 :(得分:3)

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();

答案 1 :(得分:0)

你的问题场景正是SelectMany所针对的,所以我认为我们可能试图消除它的任何事情都会使事情复杂化。 :)

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

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

.SelectMany采用IEnumerable将'初始化'初始结果转换为另一个IEnumerable,让你得到你想要的东西:

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

这是一篇篇幅更好的帖子A Visual Look at the LINQ SelectMany Operator