C# 使用linq to XML从XML文档获取XElements列表的XElements列表

C# 使用linq to XML从XML文档获取XElements列表的XElements列表,c#,.net,xml,linq,linq-to-xml,C#,.net,Xml,Linq,Linq To Xml,我创建节点对象的列表: public class Node { public string Key { get; set; } public string Value { get; set; } } public class ListNode : List<Node> { } 公共类节点 { 公共字符串密钥{get;set;} 公共字符串值{get;set;} } 公共类ListNode:列表{} 我有一个xml文档: <details> <

我创建节点对象的列表:

public class Node
{
    public string Key { get; set; }
    public string Value { get; set; }
}

public class ListNode : List<Node> {  }
公共类节点
{
公共字符串密钥{get;set;}
公共字符串值{get;set;}
}
公共类ListNode:列表{}
我有一个xml文档:

<details>
<detail>
  <node>
    <key>xxx</key>
    <value>111</value>
  </node>
  <node>
    <key>yyy</key>
    <value>222</value>
  </node>
</detail>
<detail>
  <node>
    <key>zzz</key>
    <value>333</value>
  </node>
  <node>
    <key>aaa</key>
    <value>444</value>
  </node>
</detail>
</details>

xxx
111
yyy
222
zzz
333
aaa
444
我要做的是使用linq to xml将这些xml元素放到ListNode对象列表中:

<node> => Node Object
<detail> => ListNode
<details> => List<ListNode>
=>节点对象
=>列表节点
=>列表
这是我的linq到xml请求:

List<ListNode> listNodeDetails = xElement
    .Element("details")
    .Elements("detail")
    .Elements("node")
    .Select(n => new Node() 
        { Key = n.Element("key").Value, 
          Value = n.Element("node").Element("value").Value 
        })
    .ToList();
List listNodeDetails=xElement
.要素(“细节”)
.要素(“细节”)
.元素(“节点”)
.Select(n=>newnode()
{Key=n.Element(“Key”)值,
值=n.元素(“节点”).元素(“值”).值
})
.ToList();

你还没有说你被困在哪里。。。不管怎么说,这应该能奏效

var xdoc = XDocument.Load("Test.xml");

var listNodeDetails = xdoc.Root
    .Elements("detail")
    .Elements("node").Select(
        n => new Node
        {
            Key = n.Element("key").Value,
            Value = n.Element("value").Value
        }).ToList();

你还没说你被困在哪里。。。不管怎么说,这应该能奏效

var xdoc = XDocument.Load("Test.xml");

var listNodeDetails = xdoc.Root
    .Elements("detail")
    .Elements("node").Select(
        n => new Node
        {
            Key = n.Element("key").Value,
            Value = n.Element("value").Value
        }).ToList();

首先,您实际上不需要
节点
列表节点
类。您应该能够使用
KeyValuePair
(或
Tuple
)和
List
(或
List
)获得相同的结果。以下是如何通过
列表获得所需结果的方法


在这里,您必须在添加节点之前创建一个
ListNode
,而不是使用
ToList
扩展方法。您可以将
foreach
转换为linq表达式,但我通常尽可能避免使用包含多个语句的lambda。

首先,您并不真正需要
节点
列表节点
类。您应该能够使用
KeyValuePair
(或
Tuple
)和
List
(或
List
)获得相同的结果。以下是如何通过
列表获得所需结果的方法


在这里,您必须在添加节点之前创建一个
ListNode
,而不是使用
ToList
扩展方法。您可以将
foreach
转换为linq表达式,但我通常尽可能避免lambda使用多个语句。

问题是什么?你得到的是错误还是错误的结果?如果是,请包括错误或您得到的结果。我想将xml节点恢复为ListNode对象列表xml中是否包含多个元素?只有在这种情况下,列出ListNode元素才有意义。@Giorgosbetos该示例有多个详细节点。这就是我认为OP将节点分离为单独的
ListNode
s的原因。问题是什么?你得到的是错误还是错误的结果?如果是,请包括错误或您得到的结果。我想将xml节点恢复为ListNode对象列表xml中是否包含多个元素?只有在这种情况下,列出ListNode元素才有意义。@Giorgosbetos该示例有多个详细节点。这就是我认为OP将节点分离为单独的
ListNode
s的方式。当OP想要一个
List
时,这会产生一个
List
,而实际上它只是一个
List
。基本上OP希望不同细节元素中的节点位于单独的列表中。我不想要节点列表,而是listNode类列表,如下图所示,listNode类是节点类列表,假设listNode类对应于一行,node类对应于一列,当OP需要一个实际上只是一个
列表的
列表时,这会产生一个
列表。基本上,OP希望不同细节元素中的节点位于单独的列表中。我不想要节点列表,而是listNode类列表,如下图所示,listNode类是节点类列表,假设listNode类对应于一行,而node类对应于一列
List<ListNode> list = new List<ListNode>();
foreach (var detail in element.Elements("detail"))
{
    var nodeList = new ListNode();
    nodeList.AddRange(
        detail.Elements("node")
            .Select(
                n => new Node
                {
                    Key = n.Element("key").Value,
                    Value = n.Element("value").Value
                }));
    list.Add(nodeList);
}