c#xml linq将元素添加到元素中

时间:2016-12-19 06:38:41

标签: c# xml linq

我一直在寻找和尝试几个小时,但我无法让它发挥作用。所以我决定在这里问一个问题。请帮助我。

我有一个像这样的xml

<parent>
    <anothertag/>
    <body>
        <monitor value="3"/>
        <mouse value="5"/>
        <chair>
            <monoblock value="5"/>
        </chair>
    </body>
</parent>

如果可能的话,这是我想要的xml输出

<parent>
    <anothertag/>
    <body>
        <anotherbody>
            <monitor value="3"/>
            <mouse value="5"/>
            <chair>
                <monoblock value="5"/>
            </chair>
        </anotherbody>
    </body>
</parent>

这是我的代码

string xml = "<parent>" +
                "<anothertag/>" +
                "<body>" +
                "<monitor value=\"3\"/>" +
                "<mouse value=\"5\"/>" +
                "<chair>" +
                "<monoblock value=\"5\"/>" +
                "</chair>" +
                "</body>" +
                "</parent>";
                XDocument doc = XDocument.Parse(xml);
                var p = doc.Descendants("body").Elements();

                foreach (var item in doc.Descendants("body").ToList())
                {
                    item.Add(new XElement("anotherbody", p));
                }

                Console.WriteLine(doc.ToString());

这是输出

    <parent>
  <anothertag />
  <body>
    <monitor value="3" />
    <mouse value="5" />
    <chair>
      <monoblock value="5" />
    </chair>
    <anotherbody>
      <monitor value="3" />
      <mouse value="5" />
      <chair>
        <monoblock value="5" />
      </chair>
    </anotherbody>
  </body>
</parent>

输出是多余的。我该如何删除它?

p.Remove(); 删除所有元素。谢谢

2 个答案:

答案 0 :(得分:3)

试试这个

foreach (var item in doc.Descendants("body").ToList())
{
      item.ReplaceAll(new XElement("anotherbody", item.Nodes()));
}

答案 1 :(得分:0)

我认为问题在于这一行

 var p = doc.Descendants("body").Elements();

你不应该从你的后代中提取.Elements()。将行更改为

var p = doc.Descendants("body");

它应该有效。但请记住,.Descendants()将找到与指定名称匹配的所有标记,即使它们嵌套在其他标记内也是如此。

如果标记<body>仅显示为<parent>的子项,则可能没问题,如果不是,则按以下方式重写相关行会更好

var p = doc.Elements("body");