【发布时间】:2014-09-23 18:21:36
【问题描述】:
XML 文件有这样的结构
<Nodes>
<Node> one </Node>
<Node> two </Node>
<Node> three </Node>
<Node> three </Node>
</Nodes>
由于 xml 文件有超过 30000 个节点,我正在寻找最快的方法来查找和删除重复节点。
你会怎么做?
【问题讨论】:
XML 文件有这样的结构
<Nodes>
<Node> one </Node>
<Node> two </Node>
<Node> three </Node>
<Node> three </Node>
</Nodes>
由于 xml 文件有超过 30000 个节点,我正在寻找最快的方法来查找和删除重复节点。
你会怎么做?
【问题讨论】:
您可以使用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");
另一种方法是为XElement 类实现IEqualityComparer,然后使用Distinct 方法。
【讨论】:
尝试 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# 运行它。
【讨论】: