2013-07-06 9 views
5

Jestem nowy w XML & C#. Chcę usunąć element główny bez usuwania elementu podrzędnego. Plik XML jest strudctured jak poniżej.Jak usunąć element główny w C#/

<?xml version="1.0" encoding="UTF-8"?> 
    <dataroot generated="2013-07-06T20:26:48" xmlns:od="urn:schemas-microsoft-com:officedata"> 
    <MetaDataSection> 
     <Name>KR04</Name> 
     <XMLCreationDate>02.05.2013 9:52:41 </XMLCreationDate> 
     <Address>AUTOMATIC</Address> 
     <Age>22</Age> 
    </MetaDataSection> 
    </dataroot> 

Chcę wykorzenić element "dataroot", więc powinien wyglądać jak poniżej.

<?xml version="1.0" encoding="UTF-8"?> 
    <MetaDataSection> 
     <Name>KR04</Name> 
     <XMLCreationDate>02.05.2013 9:52:41 </XMLCreationDate> 
     <Address>AUTOMATIC</Address> 
     <Age>22</Age> 
    </MetaDataSection> 

Usuwanie elementów podrzędnych wygląda na łatwe, ale nie wiem, jak usunąć tylko element główny. Poniżej znajduje się kod, który próbowałem do tej pory.

 XmlDocument xmlFile = new XmlDocument(); 
     xmlFile.Load("path to xml"); 

     XmlNodeList nodes = xmlFile.SelectNodes("//dataroot"); 

     foreach (XmlElement element in nodes) 
     { 
      element.RemoveAll(); 
     } 

Czy istnieje sposób na usunięcie tylko elementu głównego? bez usuwania elementów potomnych? Dziękuję w advnace.

Odpowiedz

8

Najprostszym sposobem na to jest z LINQ do XML - coś takiego:

XDocument input = XDocument.Load("input.xml"); 
XElement firstChild = input.Root.Elements().First(); 
XDocument output = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), 
           firstChild); 
output.Save("output.xml"); 

Lub jeśli nie trzeba deklarację XML:

XDocument input = XDocument.Load("input.xml"); 
XElement firstChild = input.Root.Elements().First(); 
firstChild.Save("output.xml"); 
+0

Dziękujemy za szybką odpowiedź. Użyłem poniżej jednego i działało idealnie. Jak to może być takie proste !? Powyższy kod działa jak zabranie pierwszego dziecka i zapisanie go bez elementu root? Bardzo to doceniam. – Toykeat

+0

@Toykeat: Dokładnie tak jak mówisz - to tylko oszczędza element. Nie musisz niczego usuwać. –

+0

@JonSkeet Co zrobić, jeśli mam wiele dzieci pod tym samym elementem root? powinienem użyć coś takiego: 'var allChildrens = input.Root.Elements();'? –

-1

jeśli trzeba zrobić w C# środki kodujące

Rozwiązanie

foreach (XElement item in Element.Descendants("dataroot").ToList()) 
     { 
      item.ReplaceWith(item.Nodes()); 
     }