Rimuovere elementi, attributi e nodi da un albero XML (LINQ to XML)

È possibile modificare un albero XML, rimuovendo elementi, attributi e altri tipi di nodi.

La rimozione di un singolo elemento o di un singolo attributo da un documento XML è un processo semplice. Tuttavia, quando si rimuovono raccolte di elementi o attributi, è necessario innanzitutto materializzare una raccolta in un elenco e quindi eliminare gli elementi o gli attributi dall'elenco. L'approccio migliore per eseguire questa operazione consiste nell'usare il metodo di estensione Remove.

Il motivo principale per cui scegliere questo approccio è che la maggior parte delle raccolte recuperate da un albero XML viene restituita tramite esecuzione posticipata. Se le raccolte non vengono dapprima materializzate in un elenco o se non vengono usati i metodi di estensione, è possibile riscontrare una determinata categoria di bug. Per altre informazioni, vedere Bug nel codice dichiarativo/imperativo misto.

I metodi seguenti consentono di rimuovere nodi e attributi da un albero XML.

metodo Descrizione
XAttribute.Remove Rimuove un oggetto XAttribute dal relativo elemento padre.
XContainer.RemoveNodes Rimuove i nodi figlio da un oggetto XContainer.
XElement.RemoveAll Rimuove il contenuto e gli attributi da un oggetto XElement.
XElement.RemoveAttributes Rimuove gli attributi di un oggetto XElement.
XElement.SetAttributeValue Rimuove l'attributo se si passa il valore null.
XElement.SetElementValue Rimuove l'attributo figlio se si passa il valore null.
XNode.Remove Rimuove un oggetto XNode dal relativo elemento padre.
Extensions.Remove Rimuove ogni attributo o elemento nella raccolta di origine dal relativo elemento padre.

Esempio: Rimuovere un singolo elemento e una raccolta di elementi in due modi

In questo esempio sono illustrati tre approcci per la rimozione di elementi. Con il primo viene rimosso un singolo elemento. In secondo luogo, recupera una raccolta di elementi, la materializza tramite l'operatore Enumerable.ToList e quindi la rimuove. Infine, viene recuperata una raccolta di elementi che viene rimossa tramite il metodo di estensione Remove.

Per altre informazioni sull'operatore ToList, vedere Conversione di tipi di dati (C#) e Conversione di tipi di dati (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)

Nell'esempio viene prodotto l'output seguente:

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

Il primo elemento nipote è stato rimosso da Child1 e tutti gli elementi nipote sono stati rimossi da Child2 e da Child3.