当前位置: 首页 > 编程语言 > C#

XML:如何删除所有没有属性的节点或子元素分享

时间:2023-04-10 20:56:39 C#

XML:如何删除所有没有属性的节点或子元素没有子元素和元素,也没有任何属性。可以使用XPath表达式找到所有没有属性或子节点的节点。然后可以从xml中删除它们。正如Sani指出的那样,您可能必须递归执行此操作,因为如果删除其内部节点,node_1_1将变为空。varxmlDocument=newXmlDocument();xmlDocument.LoadXml(@"");//选择所有没有属性和子节点的节点varnodes=xmlDocument.SelectNodes("//*[count(@*)=0andcount(child::*)=0]");Console.WriteLine("找到{0}个空节点",nodes.Count);//现在从它们的父节点中删除匹配的节点foreach(XmlNodenodeinnodes)node.ParentNode.RemoveChild(node);Console.WriteLine(xmlDocument.OuterXml);控制台.ReadLine();应该这样做:XmlNodeListnodes=xmlDocument.GetElementsByTagName("Node1");foreach(XmlNodenodeinnodes){if(node.ChildNodes.Count==0)node.RemoveAll;else{foreach(XmlNodeninnode){if(n.InnerText==String.Empty&&n.Attributes.Count==0){n.RemoveAll;此样式表使用身份转换,其中空模板匹配没有节点或属性的元素,从而防止它们被复制到输出:要对所有空子节点执行此操作,请使用for循环(不是foreach)并在相反的顺序。我将其解决为:varxmlDocument=newXmlDocument();xmlDocument.LoadXml(@"");RemoveEmptyNodes(xmlDocument);privatestaticboolRemoveEmptyNodes(XmlNodenode){if(node.HasChildNodes){for(intI=node.ChildNodes.Count-1;I>=0;I--)if(RemoveEmptyNodes(node.ChildNodes[I]))}node.RemoveChild(node.ChildNodes[I]);}return(node.Attributes==null||node.Attributes.Count==0)&&node.InnerText.Trim()==string.Empty;}递归调用(类似于其他解决方案)消除了对xPath方法的重复文档处理。更重要的是,代码更具可读性和更易于编辑。双赢。所以这个解决方案将删除,但也会正确删除和。更新:使用以下Linq实现发现显着的性能改进。stringmyXml=@"");XElementxElem=XElement.Parse(myXml);RemoveEmptyNodes2(xElem);privatestaticvoidRemoveEmptyNodes2(XElementelem){intcntElems=elem.Descendants().Count();intcntPrev;做{cntPrev=cntElems;elem.Descendants().Where(e=>string.IsNullOrEmpty(e.Value.Trim())&&!e.HasAttributes).Remove();cntElems=elem.Descendants().Count();}while(cntPrev!=cntElems);循环处理需要删除父项的情况,因为它的唯一子项已被删除。由于幕后的IEnumerable实现,使用XContainer或衍生产品往往会获得类似的性能提升。这是我最喜欢的事情。在任意68MB的xml文件上,RemoveEmptyNodes往往需要大约90秒,而RemoveEmptyNodes2往往需要大约1秒。以上是C#学习教程:XML:如何删除所有没有属性的节点或子元素共享的内容。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: