XML LINQ协助

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>

我目前正在研究XML,并在C#中使用它,在LINQ中使用它

我有以下几点

我的XML文件

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