2010-07-09 14 views
8

Usuwa wszystkie elementy z dokumentu:Usuwanie węzłów z XDocument

 XDocument document = XDocument.Load(inputFile); 
     foreach (XElement element in document.Elements()) 
     { 
      element.Remove(); 
     } 
     document.Save(outputFile); 

ta nie ma żadnego wpływu:

 XDocument document = XDocument.Load(inputFile); 
     foreach (XElement element in document.Elements()) 
     { 
      //element.Remove(); 
      foreach (XElement child in element.Elements()) 
       child.Remove(); 
     } 
     document.Save(outputFile); 

Am I brakuje czegoś tutaj? Ponieważ wszystkie są odniesieniami do elementów w XDocument, czy zmiany nie powinny zostać wprowadzone? Czy jest jakiś inny sposób, w jaki powinienem usunąć zagnieżdżone dzieci z XDocument?

Dzięki!

+0

Czy debugowania kodu? Czy na pewno element.Elements() zwraca elementy potomne? Po prostu szukam trochę więcej informacji o tym, co dokładnie się dzieje. – jrista

+0

@jrista Zwraca elementy potomne, ale problem wydaje się być związany z tym, że moduł wyliczający zachowuje się inaczej po '.Remove()'. – Jake

+1

Tak, właśnie tego bym się spodziewał. Enumeratory zazwyczaj generują wyjątki podczas modyfikowania kolekcji, ponieważ są one bardzo zależne od stabilności podstawowej kolekcji, aby działały poprawnie. Jestem naprawdę zaskoczony, że możesz kontynuować po usunięciu węzła podczas używania foreach/enumerator. Generalnie polecam używanie pętli while (lub prawdopodobnie ... ale to jest bardziej skomplikowane), niż foreach. – jrista

Odpowiedz

18

Podobno gdy iteracyjne nad element.Elements(), nazywając Remove() na jedno z dzieci przyczyn moduł wyliczający do yield break. Iterowanie ponad element.Elements().ToList() naprawiło problem.

+0

Czy to jest specyficzne dla XPath? – Neo

+0

@Neo W jaki sposób? Jak wskazano powyżej [jirsta] (http://stackoverflow.com/users/111554/jrista), większość modułów wyliczających przerwie się, gdy zmieni się podstawowa kolekcja. – Jake

+0

Tak Jestem świadomy, że wyjątek InvalidOperationException występuje normalnie. Moje pytanie dotyczy "przełomu w plonach". Czy to jest specyficzne dla komentarza XPath vis-à-vis @ jrista? – Neo

2

Oto przykład inny sposób przy użyciu System.Xml.XPath (zmienić zapytanie XPath do własnych potrzeb):

const string xml = 
    @"<xml> 
     <country> 
      <states> 
       <state>arkansas</state> 
       <state>california</state> 
       <state>virginia</state> 
      </states> 
     </country> 
    </xml>"; 
XDocument doc = XDocument.Parse(xml); 
doc.XPathSelectElements("//xml/country/states/state[.='arkansas']").ToList() 
    .ForEach(el => el.Remove());; 
Console.WriteLine(doc.ToString()); 
Console.ReadKey(true); 
2

Podczas korzystania XDocument spróbować zamiast:

XDocument document = XDocument.Load(inputFile); 
foreach (XElement element in document.Elements()) 
{ 
    document.Element("Root").SetElementValue(element , null); 
} 
document.Save(outputFile) 

Pozdrowienia, Todd

Powiązane problemy