2016-12-19 2 views
1

Я искал и пытался часами, но я не могу заставить его работать. поэтому я решил задать вопрос здесь. любезно помогите мне.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(); удалить все элементы. спасибо

+0

Почему вы не можете использовать XML-анализатор? – Prajwal

+0

какой XML-парсер @Prajwal? Я видел много примеров, только используя xml и linq, поэтому я использовал его, – imadammy

+0

. Мой плохой, не проверял код. : D – Prajwal

ответ

3

Попробуйте

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

Я думаю, что проблема в том, что в этой строке

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

вы не должны быть извлекая .Elements() из ваших потомков. Измените линию на

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

и он должен работать. Но имейте в виду, что .Descendants() найдет все теги, которые соответствуют указанному имени, даже если они вложены внутри других тегов.

Это может быть хорошо, если тег <body> появляется только как ребенок <parent>, если не было бы лучше, чтобы переписать строку в вопросе следующим

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