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
.