Xml 使用xlinq删除所有空元素

Xml 使用xlinq删除所有空元素,xml,linq-to-xml,Xml,Linq To Xml,我正在使用xlinq进行一些转换,其中一些转换可能会导致在文档中留下空元素 完成所有这些转换后,如何查询xdocument中的所有空元素 换言之;如果我删除了所有恰好是标记中唯一元素的标记,那么如何删除空标记 之前: XDocument.Parse(@"<body> <ul><li><a href="#">Joy</a></li></ul> <p>Hi.</p> </bo

我正在使用xlinq进行一些转换,其中一些转换可能会导致在文档中留下空元素

完成所有这些转换后,如何查询xdocument中的所有空元素

换言之;如果我删除了所有恰好是标记中唯一元素的标记,那么如何删除空标记

之前:

XDocument.Parse(@"<body>
   <ul><li><a href="#">Joy</a></li></ul>
   <p>Hi.</p>
</body>").Descendants("a").Remove();
之后:

<body>
   <ul><li/></ul>
   <p>Hi.</p>
</body>
我希望:

<body>
   <p>Hi.</p>
</body>

我能想到的最好的办法就是

var emptyElements = 
    from element in document.Descendants()
    where !element.Attributes().Any() && !element.Elements().Any()
    select element;


while(emptyElements.Any())
    emptyElements.Remove();

后来我意识到这是一个坏主意,它删除了太多内容,但我没有花时间找出原因。

我能想到的最好办法是

var emptyElements = 
    from element in document.Descendants()
    where !element.Attributes().Any() && !element.Elements().Any()
    select element;


while(emptyElements.Any())
    emptyElements.Remove();
然后我意识到这是个坏主意,它删除了太多内容,但我没有花时间找出原因。

检查元素s和是否足够。你需要检查一个元素是否真的是空的,绝对没有内容。XElement有一个属性,它实际上帮助您做到这一点-

检查元素是否为s且不够。你需要检查一个元素是否真的是空的,绝对没有内容。XElement有一个属性,它实际上帮助您做到这一点-


为该函数指定XmlNodeList,然后尝试以下代码 希望这可以从XMl文件中删除所有空元素和属性

    public static XmlNode RemoveNullElement(XmlNodeList xmlNodeList)
    {
        if (xmlNodeList.Count > 0)
        {
            foreach (XmlNode xmlnode in xmlNodeList)
            {
                RemoveNullChildAndAttibute(xmlnode);
                return xmlnode;
            }
        }

        return null;
    }


    public static void RemoveNullChildAndAttibute(XmlNode xmlNode)
    {
        if (xmlNode.HasChildNodes)
        {
            for (int xmlNodeCount = xmlNode.ChildNodes.Count - 1; xmlNodeCount >= 0; xmlNodeCount--)
            {
                RemoveNullChildAndAttibute(xmlNode.ChildNodes[xmlNodeCount]);
            }
        }
        else if (xmlNode.Attributes.Count == 0)
        {
            if (xmlNode.ParentNode != null)
            {
                xmlNode.ParentNode.RemoveChild(xmlNode);
            }
        }
    }

为该函数指定XmlNodeList,然后尝试以下代码 希望这可以从XMl文件中删除所有空元素和属性

    public static XmlNode RemoveNullElement(XmlNodeList xmlNodeList)
    {
        if (xmlNodeList.Count > 0)
        {
            foreach (XmlNode xmlnode in xmlNodeList)
            {
                RemoveNullChildAndAttibute(xmlnode);
                return xmlnode;
            }
        }

        return null;
    }


    public static void RemoveNullChildAndAttibute(XmlNode xmlNode)
    {
        if (xmlNode.HasChildNodes)
        {
            for (int xmlNodeCount = xmlNode.ChildNodes.Count - 1; xmlNodeCount >= 0; xmlNodeCount--)
            {
                RemoveNullChildAndAttibute(xmlNode.ChildNodes[xmlNodeCount]);
            }
        }
        else if (xmlNode.Attributes.Count == 0)
        {
            if (xmlNode.ParentNode != null)
            {
                xmlNode.ParentNode.RemoveChild(xmlNode);
            }
        }
    }

这里公认的答案并不完全正确。具体来说,它将只删除表单中的元素,并保留类似的元素

因此,这里有一个完整的解决方案:

public static void RemoveEmptyDescendants(this XNode node)
{
    var empty = from e in node.Descendants()
                where !e.Nodes().Any() && !e.Attributes().Any()
                select e;

    while (empty.Any())
    {
        empty.Remove();
    }
}

这里公认的答案并不完全正确。具体来说,它将只删除表单中的元素,并保留类似的元素

因此,这里有一个完整的解决方案:

public static void RemoveEmptyDescendants(this XNode node)
{
    var empty = from e in node.Descendants()
                where !e.Nodes().Any() && !e.Attributes().Any()
                select e;

    while (empty.Any())
    {
        empty.Remove();
    }
}

检查IsEmpty和HasAttribute更有帮助

        var emptyElements = document.Descendants()
                             .Where(element => element.IsEmpty 
                                             && !element.HasAttributes);
        while (emptyElements.Any())
        {
            emptyElements.Remove();
        }
对于仅具有属性的元素,IsEmpty将返回true。例如:

      <Participant xsi:nil="true"/>

检查IsEmpty和HasAttribute更有帮助

        var emptyElements = document.Descendants()
                             .Where(element => element.IsEmpty 
                                             && !element.HasAttributes);
        while (emptyElements.Any())
        {
            emptyElements.Remove();
        }
对于仅具有属性的元素,IsEmpty将返回true。例如:

      <Participant xsi:nil="true"/>