2009-10-29 26 views
5

Tôi có một XDocument và phải loại bỏ một nút và thêm nút rất giống lại sau một số thao tác (nút xelement của tôi phức tạp và có các nút bên trong tốt). Có ai có một cách tốt để làm điều này như nút thao tác mới của tôi đang được thêm vào cuối của xmldocument. Bất kỳ đoạn mã nào cũng sẽ được đánh giá cao.LINQ to XML - loại bỏ một nút và thêm một nút mới tại cùng một vị trí

Trả lời

4

Nếu bạn chỉ cần chỉnh sửa các nút, thì tại sao loại bỏ nó ở tất cả? Chỉ cần có một tham chiếu đến nó trong cây và chỉnh sửa nó tại chỗ.

Nếu đó không phải là một lựa chọn vì lý do nào đó, sau đó bạn đã tìm thấy XElement (hoặc, nói chung, XNode) bạn cần thay thế trong cây, tạo XElement mới để phục vụ như một sự thay thế, và sau đó sử dụng phương thức XNode.ReplaceWith trên phần tử cũ, chuyển giao phương thức mới làm đối số.

8

Nếu tôi hiểu bạn đúng, điều này sẽ giúp bạn làm điều đó.

SolarSystem.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<SolarSystem> 
    <Planets> 
    <Planet Id="1"> 
     <Name>Mercury</Name> 
    </Planet> 
    <Planet Id="2"> 
     <Name>Venus</Name> 
    </Planet> 
    <Planet Id="3"> 
     <Name>Earth</Name> 
    </Planet> 
    </Planets> 
</SolarSystem> 

Mã tìm <Planet> Mercury, thêm một yếu tố thêm vào nó, loại bỏ nó, và reinserts nó ở phần cuối của bộ sưu tập <Planets>.

XDocument SolarSystem = XDocument.Load(Server.MapPath("SolarSystem.xml")); 
IEnumerable<XElement> Planets = SolarSystem.Element("SolarSystem").Element("Planets").Elements("Planet"); 

// identify and change Mercury 
XElement Mercury = Planets.Where(p => p.Attribute("Id").Value == "1").FirstOrDefault(); 
Mercury.Add(new XElement("YearLengthInDays", "88")); 

// remove Mercury from current position, and add back in at the end 
Mercury.Remove(); 
Planets.Last().AddAfterSelf(Mercury); 

// save it as new file 
SolarSystem.Save(Server.MapPath("NewSolarSystem.xml")); 

mang đến cho:

<?xml version="1.0" encoding="UTF-8"?> 
    <SolarSystem> 
    <Planets> 
     <Planet Id="2"> 
     <Name>Venus</Name> 
     </Planet> 
     <Planet Id="3"> 
     <Name>Earth</Name> 
     </Planet> 
     <Planet Id="1"> 
     <Name>Mercury</Name> 
     <YearLengthInDays>88</YearLengthInDays> 
     </Planet> 
    </Planets> 
    </SolarSystem> 
+1

+1: Mẫu 101 đẹp để mọi người bắt đầu –

1

Điều này chỉ được xây dựng trên ví dụ của @Ralph Lavelle ở trên. Tôi đã tạo ra một ứng dụng giao diện điều khiển hoàn chỉnh để tôi có thể chơi với mã & hiểu nó tốt hơn. Tôi đã chia sẻ nó. Nó sử dụng chính xác XML mẫu từ trên cao, nhưng tôi đã phải loại bỏ các tham chiếu đến Server.MapPath() vì tôi không thể tìm ra cách làm cho chúng hoạt động. Ở đây bạn đi:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Linq; 

class LinqDemo 
{ 
static void Main() 
    { 
     XDocument SolarSystem = XDocument.Load("SolarSystem.xml"); 
     IEnumerable<XElement> Planets = SolarSystem.Element("SolarSystem").Element("Planets").Elements("Planet"); 

     // identify and change Mercury 
     XElement Mercury = Planets.Where(p => p.Attribute("Id").Value == "1").FirstOrDefault(); 
     Mercury.Add(new XElement("YearLengthInDays", "88")); 

     // remove Mercury from current position, and add back in at the end 
     Mercury.Remove(); 
     Planets.Last().AddAfterSelf(Mercury); 

     // save it as new file 
     SolarSystem.Save("NewSolarSystem.xml"); 
    } 
} 

Có lẽ điều này sẽ giúp một LINQ noob khác như tôi.

+0

Đánh giá cao ví dụ làm việc ngắn gọn. Tìm thấy rằng 'using System;' là *** không phải ***. Nhưng rằng 'sử dụng System.Xml;' *** là *** bắt buộc. – DavidRR

+0

Bạn đang khá hoan nghênh. Tôi ghét tìm một câu hỏi dường như có câu trả lời tôi đang tìm kiếm và mã mơ hồ về cách thực sự đi về nó. Tốt bắt gặp lỗi sử dụng. – delliottg

Các vấn đề liên quan