2009-10-29 6 views
5

Bir XDocument var ve bir düğüm kaldırmak ve bir düğümden sonra aynı düğümü tekrar eklemek zorundayım (xelement düğümüm karmaşık ve iç düğümler var) iyi). Yeni manipüle edilmiş düğümümün xmldocument sonuna eklendiğinden, bunu yapmak için iyi bir yolu var. Herhangi bir kod parçacığı büyük takdir edilecektir.Linq to XML - bir düğümü kaldır ve aynı yerde yeni bir düğüm ekle

cevap

4

sadece düğümü düzenlerken, o zaman neden hiç kaldırmak? Sadece ağaçta bir referans alın ve onu yerinde düzenleyin.

o nedense bir seçenek değil, o bu konuda gitmek için tek yön şudur: Eğer XElement (veya genel olarak XNode) ağaca değiştirmeniz gerekiyor, yeni XElement oluşturmak bulduktan sonra Bir yedek olarak hizmet etmek ve sonra eski öğede XNode.ReplaceWith yöntemini kullanarak argüman olarak yeni birini geçirin.

8

Seni doğru anlıyorsam, bu sana yardım etmeli.

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> 

kod <Planet> Merkür bulur kaldırır, bunun için fazladan eleman ekler ve <Planets> koleksiyonun sonunda onu reinserts. verir

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

:

<?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: İnsanları işe almak için güzel 101 örnek –

1

Bu sadece yukarıdaki @Ralph Lavelle örneğine dayanır. Ben tam bir konsol uygulaması oluşturdum böylece & daha iyi anlayabiliyordum. Figürlü paylaşırdım. Yukarıdaki aynı örnek XML'i kullanır, ancak Server.MapPath() 'a yapılan başvuruları, onları nasıl çalıştıracaklarını anlayamadığım için kaldırmam gerekiyordu. İşte böyle:

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

Belki de bu benim gibi başka bir LINQ noob'a yardımcı olur.

+0

Özlü çalışma örneğini takdir edin. '' System'i kullanarak '' *** 'nin gerekli olmadığını buldum. Ama bu 'System.Xml kullanarak' '*** gereklidir. – DavidRR

+0

Oldukça hoş geldiniz. Aradığım cevabı görecek bir soru bulmaktan ve bununla ilgili olarak nasıl gideceğine dair belirsiz bir koddan nefret ediyorum. Kullanım hatasını iyi yakalayın. – delliottg