2013-07-06 38 views
5

Tôi mới sử dụng XML & C#. Tôi muốn xóa phần tử gốc mà không xóa phần tử con. Tệp XML được strudctured như dưới đây.Cách xóa phần tử gốc trong 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> 

Tôi muốn phần tử gốc "dataroot", do đó, nó sẽ trông giống như dưới đây.

<?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> 

Xóa các phần tử con trông dễ dàng, nhưng tôi không biết cách chỉ xóa phần tử gốc. Dưới đây là mã tôi đã thử cho đến nay.

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

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

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

Có cách nào để chỉ xóa phần tử gốc không? mà không xóa các phần tử con? Cảm ơn bạn đã ủng hộ.

Trả lời

8

Cách đơn giản nhất để làm điều này là với LINQ to XML - một cái gì đó như thế này:

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"); 

Hoặc nếu bạn không cần phải khai báo XML:

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

Cảm ơn bạn đã phản hồi nhanh chóng. Tôi sử dụng dưới đây và nó hoạt động hoàn hảo. Làm thế nào điều này có thể đơn giản như thế này !? Đoạn mã trên hoạt động giống như lấy đứa con đầu tiên và lưu nó mà không có phần tử gốc? Tôi rất trân trọng điều này. – Toykeat

+0

@Toykeat: Chính xác như bạn nói - nó chỉ lưu phần tử. Không cần phải loại bỏ bất cứ điều gì. –

+0

@JonSkeet Nếu tôi có nhiều trẻ em dưới cùng một yếu tố gốc thì sao? Tôi nên sử dụng một cái gì đó như: 'var allChildrens = input.Root.Elements();'? –

-1

nếu bạn cần phải làm trong C# mã hóa có nghĩa

giải pháp

foreach (XElement item in Element.Descendants("dataroot").ToList()) 
     { 
      item.ReplaceWith(item.Nodes()); 
     } 
Các vấn đề liên quan