在XML中查找和删除重复节点的最快方法是什么?

时间:2014-09-23 18:21:36

标签: c# .net xml linq

XML文件具有这样的结构

<Nodes>
   <Node> one </Node>
   <Node> two </Node>
   <Node> three </Node>
   <Node> three </Node>
</Nodes>

由于xml文件有超过30000个节点,我正在寻找查找和删除重复节点的最快方法。

你会怎么做?

2 个答案:

答案 0 :(得分:7)

您可以使用HashSet

var values = new HashSet<string>();
var xmlDocument = XDocument.Load("path");

foreach(var node in xmlDocument.Root.Elements("Node").ToList())
{
   if(!values.Add((string)node)) 
       node.Remove();
}

xmlDocument.Save("newpath");

另一种方法是为IEqualityComparer类实现XElement,然后使用Distinct方法。

答案 1 :(得分:1)

尝试XSLT 2.0转换:

<Nodes xmlns:xsl="http://www.w3..org/1999/XSL/Transform" xsl:version="2.0">
 <xsl:for-each-group select="/Nodes/Node" group-by=".">
  <xsl:copy-of select="current-group()[1]"/>
 </xsl:for-each-group>
</Nodes>

您可以使用Saxon或XmlPrime从C#运行它。