C# 如何在LINQ to XML语句中返回同级元素?
从以下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
<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()));