How to remove all empty XElements

HalesD

New Member
This one is a little tricky. Say I have this XmlDocument\[code\]<Object> <Property1>1</Property1> <Property2>2</Property2> <SubObject> <DeeplyNestedObject /> </SubObject></Object>\[/code\]I want to get back this\[code\]<Object> <Property1>1</Property1> <Property2>2</Property2></Object>\[/code\]Since each of the children of \[code\]<SubObject>\[/code\] are all empty elements I want to get rid of it. What makes it challenging is that you cant remove nodes as you're iterating over them. Any help would be much appreciated.UPDATE Here's what I wound up with.\[code\]public XDocument Process(){ //Load my XDocument var xmlDoc = GetObjectXml(_source); //Keep track of empty elements var childrenToDelete = new List<XElement>(); //Recursively iterate through each child node foreach (var node in xmlDoc.Root.Elements()) Process(node, childrenToDelete); //An items marked for deletion can safely be removed here //Since we're not iterating over the source elements collection foreach (var deletion in childrenToDelete) deletion.Remove(); return xmlDoc;}private void Process(XElement node, List<XElement> elementsToDelete){ //Walk the child elements if (node.HasElements) { //This is the collection of child elements to be deleted //for this particular node var childrenToDelete = new List<XElement>(); //Recursively iterate each child foreach (var child in node.Elements()) Process(child, childrenToDelete); //Delete all children that were marked as empty foreach (var deletion in childrenToDelete) deletion.Remove(); //Since we just removed all this nodes empty children //delete it if there's nothing left if (node.IsEmpty) elementsToDelete.Add(node); } //The current leaf node is empty so mark it for deletion else if (node.IsEmpty) elementsToDelete.Add(node);}\[/code\]If anyone is interested in the use case for this it's for an ObjectFilter project I put together.
 
Back
Top