Removing Elements, Attributes, and Nodes from an XML Tree

You can modify an XML tree, removing elements, attributes, and other types of nodes.

Removing a single element or a single attribute from an XML document is straightforward. However, when removing collections of elements or attributes, you should first materialize a collection into a list, and then delete the elements or attributes from the list. The best approach is to use the Remove extension method, which will do this for you.

The main reason for doing this is that most of the collections you retrieve from an XML tree are yielded using deferred execution. If you do not first materialize them into a list, or if you do not use the extension methods, it is possible to encounter a certain class of bugs. For more information, see Mixed Declarative Code/Imperative Code Bugs (LINQ to XML).

The following methods remove nodes and attributes from an XML tree.

Method

Description

[M:System.Xml.Linq.XAttribute.Remove()]

Removes an XAttribute from its parent.

[M:System.Xml.Linq.XContainer.RemoveNodes()]

Removes the child nodes from an XContainer.

XElement.RemoveAll

Removes content and attributes from an XElement.

XElement.RemoveAttributes

Removes the attributes of an XElement.

XElement.SetAttributeValue

If you pass null for value, then removes the attribute.

XElement.SetElementValue

If you pass null for value, then removes the child element.

XNode.Remove

Removes an XNode from its parent.

Extensions.Remove

Removes every attribute or element in the source collection from its parent element.

Example

Description

This example demonstrates three approaches to removing elements. First, it removes a single element. Second, it retrieves a collection of elements, materializes them using the Enumerable.ToList<TSource> operator, and removes the collection. Finally, it retrieves a collection of elements and removes them using the Remove extension method.

For more information on the ToList<TSource> operator, see Converting Data Types.

Code

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)

Comments

This code produces the following output:

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

Notice that the first grandchild element has been removed from Child1. All grandchildren elements have been removed from Child2 and from Child3.

See Also

Other Resources

Modifying XML Trees (LINQ to XML)