Este es un poco complicado. Decir que tengo este XmlDocumentCómo eliminar todos los XElements vacíos
<Object>
<Property1>1</Property1>
<Property2>2</Property2>
<SubObject>
<DeeplyNestedObject />
</SubObject>
</Object>
quiero volver este
<Object>
<Property1>1</Property1>
<Property2>2</Property2>
</Object>
Como cada uno de los hijos de <SubObject>
están todos los elementos vacíos que quiero para deshacerse de él. Lo que lo hace desafiante es que no puedes eliminar los nodos cuando estás iterando sobre ellos. Cualquier ayuda sería muy apreciada.
ACTUALIZACIÓN Esto es lo que terminé con.
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);
}
Si alguien está interesado en el caso de uso para esto es para un proyecto de ObjectFilter que arme.
Use System.Xml para leer el archivo de configuración –
@sarooptrivedi: Lea la pregunta. – SLaks
@SLaks: Realizo las mismas cosas en mi proyecto. Puede leer el XMLDOcument y luego actualizar el archivo y guardar el xml por fin –