Как удалить все пустые XElements

Это немного сложно. Скажем, у меня есть этот XmlDocument


    1
    2
    
         
    

Я хочу вернуть это


    1
    2

Поскольку все дочерние элементы являются пустыми элементами, я хочу от них избавиться. Что делает его сложным, так это то, что вы не можете удалять узлы, когда перебираете их. Любая помощь приветствуется.

ОБНОВЛЕНИЕВот что у меня получилось.

public XDocument Process()
{
    //Load my XDocument
    var xmlDoc = GetObjectXml(_source);

    //Keep track of empty elements
    var childrenToDelete = new List();

    //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 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();

        //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);
}

Если кого-то интересует вариант использования для этого, то это для проекта ObjectFilter, который я собрал.

7
задан Micah 15 June 2012 в 15:11
поделиться