|Important||This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here.|
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 (C#) (LINQ to XML).
The following methods remove nodes and attributes from an XML tree.
Removes an XAttribute from its parent.
Removes the child nodes from an XContainer.
Removes content and attributes from an XElement.
Removes the attributes of an XElement.
If you pass null for value, then removes the attribute.
If you pass null for value, then removes the child element.
Removes an XNode from its parent.
Removes every attribute or element in the source collection from its parent element.
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.
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);