Xml 使用xlinq删除所有空元素
我正在使用xlinq进行一些转换,其中一些转换可能会导致在文档中留下空元素 完成所有这些转换后,如何查询xdocument中的所有空元素 换言之;如果我删除了所有恰好是标记中唯一元素的标记,那么如何删除空标记 之前: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
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"/>