C# 如何在LINQ to XML语句中返回同级元素?

C# 如何在LINQ to XML语句中返回同级元素?,c#,.net,xml,linq,linq-to-xml,C#,.net,Xml,Linq,Linq To Xml,从以下XML输入: <root> <node name="one" value="1"/> <node name="two" value="2"/> <node name="three" value="3"/> <node name="four" value="4"/> </root>"; 我需要使用LINQ to XML生成以下内容: <root> <name content="on

从以下XML输入:

<root>
  <node name="one" value="1"/>
  <node name="two" value="2"/>
  <node name="three" value="3"/>
  <node name="four" value="4"/>
</root>";
我需要使用LINQ to XML生成以下内容:

<root>
  <name content="one"/>
  <value content="1"/>
  <name content="two"/>
  <value content="2"/>
  <name content="three"/>
  <value content="3"/>
  <name content="four"/>
  <value content="4"/>
</root>
此代码生成name元素,但不生成value元素

var input = @"
<root>
  <node name=""one"" value=""1""/>
  <node name=""two"" value=""2""/>
  <node name=""three"" value=""3""/>
  <node name=""four"" value=""4""/>
</root>";


var xml = XElement.Parse(input);
var query = new XElement("root",
    from p in xml.Elements("node")
    select new XElement("name",
        new XAttribute("content", p.Attribute("name").Value) /*,

        new XElement("value", new XAttribute("content", p.Attribute("value").Value)) */
        )
    );
如果我将上面注释掉的值XElement包含在最后一个圆括号内,那么它是name元素的子元素,但在右圆括号外,它不再具有对q的访问权限,它位于查询之外


感觉好像我需要将两个像素连接在一起,或者以某种方式将它们包含在另一个不生成任何XML的集合中。

您可以使用。在查询格式中,这相当于两种:

相比之下,使用实际的SelectMany方法并流利地编写它将如下所示:

var query = new XElement("root",
        xml.Elements("node")
           .SelectMany(n => n.Attributes())
           .Select(a => new XElement(a.Name,
                new XAttribute("content", a.Value))));

然而,我倾向于发现查询语法在大多数用法中更清晰,我倾向于坚持一种或另一种格式,尽管将两者混合使用是非常好的。

使用您的代码作为起点。将该对包装在item元素中,然后用其子元素替换它

        var xml = XElement.Parse(input);
        var result = new XElement("root",
            from p in xml.Elements("node")
            select new XElement("item", 
                        new XElement("name", new XAttribute("content", p.Attribute("name").Value)),
                        new XElement("value", new XAttribute("content", p.Attribute("value").Value))));

        result.Descendants("item").ToList().ForEach(n => n.ReplaceWith(n.Elements()));

我知道这是怎么回事。现在看看我是否能将它改编成我真正的代码。我花了一分钟才弄明白。啊,很有创意。如果不用第二次传递就可以用它的子项替换该项,那就太好了。虽然@Ahmad's更优雅,对我写的问题有更好的回答,但我实际上使用了你的方法,因为它更适合我的产品代码。@Jim有趣。。。哈桑的方法是否增加了一些灵活性?只是好奇:@Ahmad你的方法是对的。在我的实际代码中,第二个元素实际上有一个完整的元素和属性层次结构。我没有找到一种方法来调整你的方法来支持这一点。当然,我可能错过了什么。如果您想了解如何找到更优雅的解决方案,我很乐意提供一些更复杂的示例代码。
        var xml = XElement.Parse(input);
        var result = new XElement("root",
            from p in xml.Elements("node")
            select new XElement("item", 
                        new XElement("name", new XAttribute("content", p.Attribute("name").Value)),
                        new XElement("value", new XAttribute("content", p.Attribute("value").Value))));

        result.Descendants("item").ToList().ForEach(n => n.ReplaceWith(n.Elements()));