删除空的XML标签我正在寻找一种有效地从XML中删除空标签的好方法。你有什么建议吗?正则表达式?X文档?XML文本阅读器?例如,conststringoriginal=@"TomPuppyBiggy";可能变成:conststringexpected=@"TomPuppyBiggy";将原始文件加载到XDocument中并使用以下代码提供所需的输出:vardocument=XDocument.Parse(original);document.Descendants().Where(e=>e.IsEmpty||String.IsNullOrWhiteSpace(e.Value)).Remove();这意味着对处理属性的公认答案进行了改进:XDocumentxd=XDocument.Parse(original);xd.Descendants().Where(e=>(e.Attributes().All(a=>a.IsNamespaceDeclaration||string.IsNullOrWhiteSpace(a.Value))&&string.IsNullOrWhiteSpace(e.Value)&&e.Descendants().SelectMany(c=>c.Attributes()).All(ca=>ca.IsNamespaceDeclaration||string.IsNullOrWhiteSpace(ca.Value)))).Remove();这里的想法是在删除元素之前检查元素上的所有属性是否也为空。还有一种情况是null后代可以具有非null属性。我插入了第三个条件来检查元素是否在其后代中具有所有空属性。考虑添加了node8的以下文档:这变成:这个问题的原始和改进的答案将丢失node2和node6和node8节点。如果你只想像这样删除,那么检查e.IsEmpty就可以了,但如果你想同时使用和。如果您还需要删除空属性,您可以这样做:xd.Descendants().Attributes().Where(a=>string.IsNullOrWhiteSpace(a.Value)).Remove();xd.Descendants().Where(e=>(e.Attributes().All(a=>a.IsNamespaceDeclaration))&&string.IsNullOrWhiteSpace(e.Value)).Remove();这将为您提供:一如既往,这取决于您的要求。你知道空标签会如何显示吗?(例如,等)我一般不推荐正则表达式(它们非常有用但同时也是邪恶的)。除非您的XML没有某种结构,否则考虑使用string.Replace方法似乎也有问题。最后,我建议使用XML解析器方法(确保您的代码是有效的XML)。vardoc=XDocument.Parse(原始);varemptyElements=fromdescendantindoc.Descendants()其中descendant.IsEmpty||string.IsNullOrWhiteSpace(descendant.Value)选择后代;emptyElements.Remove();无论你使用什么文件,都必须至少传递一次。如果它只是一个你知道的命名标签,那么正则表达式是你的朋友,否则使用堆栈方法。从父标记开始,如果它有子标记,则将它们放入堆栈。如果您发现一个空标签将其删除,那么一旦您通过子标签并到达堆栈顶部的结束标签,然后弹出并检查它。如果它是空的,也将其删除。这样您就可以删除所有空标签,包括带有空子标签的标签。如果在注册表达式后使用此XDocument可能最容易实现,如果您知道文档相当小,它可以提供足够的性能。在处理非常大的文档时,XmlTextReader将比XDocument更快并且使用更少的内存。正则表达式最适合处理文本而不是XML。它可能无法处理您想要的所有边缘情况(例如,CDATA部分中的标签;具有xmlns属性的标签),因此对于一般实现而言可能不是一个好主意,但可能就足够了,具体取决于您对输入XML的控制程度。如果我们谈论性能(它提供对XML的快速、仅向前的访问),XmlTextReader是更可取的。您可以使用XmlReader.IsEmptyElement属性来确定标记是否为空。XDocument方法产生需要的输出:以上是C#学习教程的全部内容:删除空的XML标签。n){返回n.IsEmpty||(string.IsNullOrEmpty(n.Value)&&(!n.HasElements||n.Elements().All(IsEmpty)));}vardoc=XDocument.Parse(原始);varemptyNodes=doc.Descendants().Where(IsEmpty);foreach(varemptyNodeinemptyNodes.ToArray()){emptyNode.Remove();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理会员删除。如需转载请注明出处:
