Remover elementos, atributos e nós de uma árvore XML (LINQ to XML)

Você pode modificar uma árvore XML, removendo elementos, atributos e outros tipos de nós.

Remover um único elemento ou um único atributo de um documento XML é simples. No entanto, ao remover coleções de elementos ou atributos, você deve primeiro materializar uma coleção em uma lista e, em seguida, excluir os elementos ou atributos da lista. A melhor abordagem é usar o Remove método de extensão para fazer isso.

A principal razão para usar essa abordagem é que a maioria das coleções recuperadas de uma árvore XML são produzidas usando execução adiada. Se você não primeiro materializá-los em uma lista, ou se você não usar os métodos de extensão, você pode encontrar uma certa classe de bugs. Para obter mais informações, consulte Bugs de código declarativo/imperativo mistos.

Os métodos a seguir removem nós e atributos de uma árvore XML.

Método Description
XAttribute.Remove Remova um XAttribute de seu pai.
XContainer.RemoveNodes Remova os nós filho de um XContainerarquivo .
XElement.RemoveAll Remover conteúdo e atributos de um XElementarquivo .
XElement.RemoveAttributes Remova os atributos de um XElementarquivo .
XElement.SetAttributeValue Remova o atributo se passar o valor null.
XElement.SetElementValue Remova o elemento filho se você passar o valor null.
XNode.Remove Remova um XNode de seu pai.
Extensions.Remove Remova todos os atributos ou elementos da coleção de origem de seu elemento pai.

Exemplo: remover um único elemento e remover uma coleção de elementos de duas maneiras

Este exemplo demonstra três abordagens para remover elementos. Primeiro, ele remove um único elemento. Em segundo lugar, ele recupera uma coleção de elementos, materializa-os usando o Enumerable.ToList operador e, em seguida, remove a coleção. Finalmente, ele recupera uma coleção de elementos e os remove usando o Remove método de extensão.

Para obter mais informações sobre o ToList operador, consulte Convertendo tipos de dados (C#) e Convertendo tipos de dados (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)

Este exemplo produz a seguinte saída:

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

O primeiro elemento neto foi retirado de Child1, e todos os elementos netos foram removidos de Child2 e de Child3.