XML LINQ协助
我目前正在研究XML,并在C#中使用它,在LINQ中使用它 我有以下几点 我的XML文件XML LINQ协助,xml,linq,Xml,Linq,我目前正在研究XML,并在C#中使用它,在LINQ中使用它 我有以下几点 我的XML文件 <RECSTEPS> <RECSTEPS1> <STEP>Step 1 - prepare</STEP> <STEP>Step 2 - cut</STEP> </RECSTEPS1> <RECSTEPS2> <STEP>Step 1 - prepare</STEP>
<RECSTEPS>
<RECSTEPS1>
<STEP>Step 1 - prepare</STEP>
<STEP>Step 2 - cut</STEP>
</RECSTEPS1>
<RECSTEPS2>
<STEP>Step 1 - prepare</STEP>
<STEP>Step 2 - cut</STEP>
<STEP>Step 3 - Weld</STEP>
</RECSTEPS2>
<RECSTEPS3>
<STEP>Step 1 - prepare</STEP>
<STEP>Step 2 - cut</STEP>
</RECSTEPS3>
</RECSTEPS>
这很好,但是,我正在尝试使用LINQ来做同样的事情。我得到相同的计数,但无法得到输出,即枚举中的内容。我看了手表,但看不出来
var t2 = xd.Root.Elements().Select(o => o.Element("RECSTEPS2"));
谢谢您的代码错了。应该是:
var t2 = xd.Descendants("RECSTEPS2")
.SelectMany(e => e.Elements());
在查询中,您将根节点的每个元素投影到RECSTEPS2
元素的值。换句话说,您的查询将返回与根节点下的元素数量相同的元素RECSTEPS2
您所考虑的是过滤,即使用Where
操作符,类似以下内容:
var t2 = xd.Root.Elements()
.Where(e => e.Name == "RECSTEPS2");
var t2 = xd.Descendants("RECSTEPS2")
.SelectMany(e => e.Elements());
foreach(var xe in t2)
Console.WriteLine(xe.Value);
// Will print
// Step 1 - prepare etc
但是上面给出的IEnumerable
与元素RECSTEPS2
的标准匹配(尽管只有一个匹配)。
换句话说,要使用上面的代码迭代RECSTEPS2
的子元素,您需要一个双循环:
foreach(var parent in t2)
foreach(var child in parent)
Console.WriteLine(child.Value);
使用SelectMany
的好处在于,它将元素的层次结构扁平化,只提供RECSTEPS2
节点的子元素,因此完整的代码如下所示:
var t2 = xd.Root.Elements()
.Where(e => e.Name == "RECSTEPS2");
var t2 = xd.Descendants("RECSTEPS2")
.SelectMany(e => e.Elements());
foreach(var xe in t2)
Console.WriteLine(xe.Value);
// Will print
// Step 1 - prepare etc
首先,帮你自己一个忙,得到一份工作。它可以让您使用Linq查询,并立即获得查询执行情况的视觉反馈 将您的代码直接翻译为
Linq
,如下所示:
IEnumerable<string> stepTwoSteps = xd.Root
.Descendants("RECSTEPS2")
.Elements()
.Select (rs2 => rs2.Value);
foreach(string stepValue in stepTwoSteps)
{
Console.WriteLine(stepValue);
}