Ta bort element, attribut och noder från ett XML-träd (LINQ till XML)

Du kan ändra ett XML-träd, ta bort element, attribut och andra typer av noder.

Det är enkelt att ta bort ett enskilt element eller ett enda attribut från ett XML-dokument. Men när du tar bort samlingar av element eller attribut bör du först materialisera en samling till en lista och sedan ta bort elementen eller attributen från listan. Det bästa sättet är att använda Remove tilläggsmetoden för att göra detta.

Den främsta anledningen till att använda den här metoden är att de flesta samlingar som du hämtar från ett XML-träd returneras med uppskjuten körning. Om du inte först materialiserar dem till en lista, eller om du inte använder tilläggsmetoderna, kan du stöta på en viss klass av buggar. Mer information finns i Blandade deklarativa/imperativa kodbuggar.

Följande metoder tar bort noder och attribut från ett XML-träd.

Metod beskrivning
XAttribute.Remove Ta bort en XAttribute från dess överordnade.
XContainer.RemoveNodes Ta bort de underordnade noderna från en XContainer.
XElement.RemoveAll Ta bort innehåll och attribut från en XElement.
XElement.RemoveAttributes Ta bort attributen för en XElement.
XElement.SetAttributeValue Ta bort attributet om du skickar värdet null.
XElement.SetElementValue Ta bort det underordnade elementet om du skickar värdet null.
XNode.Remove Ta bort en XNode från dess överordnade.
Extensions.Remove Ta bort varje attribut eller element i källsamlingen från dess överordnade element.

Exempel: Ta bort ett enda element och ta bort en samling element på två sätt

Det här exemplet visar tre metoder för att ta bort element. Först tar den bort ett enda element. För det andra hämtar den en samling element, materialiserar dem med operatorn Enumerable.ToList och tar sedan bort samlingen. Slutligen hämtar den en samling element och tar bort dem med hjälp av Remove tilläggsmetoden.

Mer information om operatorn finns i ToList Konvertera datatyper (C#) och Konvertera datatyper (Visual Basic).

XElement root = XElement.Parse(@"<Root>
    <Child1>
        <GrandChild1/>
        <GrandChild2/>
        <GrandChild3/>
    </Child1>
    <Child2>
        <GrandChild4/>
        <GrandChild5/>
        <GrandChild6/>
    </Child2>
    <Child3>
        <GrandChild7/>
        <GrandChild8/>
        <GrandChild9/>
    </Child3>
</Root>");
root.Element("Child1").Element("GrandChild1").Remove();
root.Element("Child2").Elements().ToList().Remove();
root.Element("Child3").Elements().Remove();
Console.WriteLine(root);
Dim root As XElement = _
    <Root>
        <Child1>
            <GrandChild1/>
            <GrandChild2/>
            <GrandChild3/>
        </Child1>
        <Child2>
            <GrandChild4/>
            <GrandChild5/>
            <GrandChild6/>
        </Child2>
        <Child3>
            <GrandChild7/>
            <GrandChild8/>
            <GrandChild9/>
        </Child3>
    </Root>
root.<Child1>.<GrandChild1>.Remove()
root.<Child2>.Elements().ToList().Remove()
root.<Child3>.Elements().Remove()
Console.WriteLine(root)

Det här exemplet genererar följande utdata:

<Root>
  <Child1>
    <GrandChild2 />
    <GrandChild3 />
  </Child1>
  <Child2 />
  <Child3 />
</Root>

Det första barnbarnselementet togs bort från Child1, och alla barnbarnselement togs bort från Child2 och från Child3.