Share via


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

Você pode modificar uma árvore XML, remover 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 depois excluir os elementos ou os atributos da lista. A melhor abordagem é usar o método de extensão Remove para fazer isso.

O principal motivo para usar essa abordagem é que a maioria das coleções que você recupera de uma árvore XML é suspensa usando a execução adiada. Se você não materializar essas coleções primeiro em uma lista, ou não usar os métodos de extensão, poderá encontrar uma determinada classe de bugs. Para obter mais informações, consulte Bugs misturados de código declarativo/imperativo.

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

Método Descrição
XAttribute.Remove Remove um XAttribute de seu pai.
XContainer.RemoveNodes Remove os nós filho de um XContainer.
XElement.RemoveAll Remove o conteúdo e os atributos de um XElement.
XElement.RemoveAttributes Remove os atributos de um XElement.
XElement.SetAttributeValue Remove o atributo se você passar o valor null.
XElement.SetElementValue Remove o elemento filho se você passar o valor null.
XNode.Remove Remove um XNode de seu pai.
Extensions.Remove Remove cada atributo ou elemento na coleção de origem do respectivo 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. Segundo, ele recupera uma coleção de elementos, materializa essa coleção usando o operador Enumerable.ToList e depois remove a coleção. Por último, recupera uma coleção de elementos e remove-a usando o método de extensão Remove.

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

Esse exemplo gera a saída a seguir:

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

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