Eliminación de elementos, atributos y nodos de un árbol XML (LINQ to XML)

Puede modificar un árbol XML mediante la eliminación de elementos, atributos y otros tipos de nodos.

Quitar un elemento o un atributo de un documento XML resulta sencillo. Sin embargo, al quitar colecciones de elementos o atributos, primero debe materializar una colección en una lista y, a continuación, eliminar los elementos o los atributos de ésta. El mejor método consiste en usar el método de extensión Remove, que se ocupará de todo esto.

El motivo principal para este enfoque radica en que la mayoría de las colecciones que se recuperan de un árbol XML se producen con una ejecución aplazada. Si no las materializa primero en una lista, o bien si no usa los métodos de extensión, es posible que aparezca una clase determinada de errores. Para obtener más información, consulte Errores en códigos declarativos/imperativos mixtos.

Los siguientes métodos sirven para quitar nodos y atributos de un árbol XML.

Método Descripción
XAttribute.Remove Quita un elemento XAttribute de su elemento primario.
XContainer.RemoveNodes Quita los nodos secundarios de un elemento XContainer de la colección.
XElement.RemoveAll Quita el contenido y los atributos de un elemento XElement.
XElement.RemoveAttributes Quita los atributos de un elemento XElement.
XElement.SetAttributeValue Quita el atributo si pasa el valor null.
XElement.SetElementValue Quita el elemento secundario si pasa el valor null.
XNode.Remove Quita un elemento XNode de su elemento primario.
Extensions.Remove Quita todos los atributos o elementos de la colección de origen de su elemento primario.

Ejemplo: Quitar un solo elemento y quitar una colección de elementos de dos maneras

Este ejemplo demuestra tres métodos para quitar elementos. Primero, quita un solo elemento. En segundo lugar, recupera una colección de elementos, los materializa con el operador Enumerable.ToList y quita la colección. Por último, recupera una colección de elementos y los quita con el método de extensión Remove.

Para obtener más información sobre el operador ToList, vea Convertir tipos de datos (C#) y Convertir tipos de datos (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 ejemplo produce el siguiente resultado:

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

El primer elemento de nieto se quitó de Child1, y todos los elementos de los nietos se quitaron de Child2 y de Child3.