[XML]删除XML文档中的重复节点(C# + XmlTextReader)

这已经是关于删除XML文档中重复节点的第三篇Blog了。是不是感觉有点水啊?呵呵,最近一直在玩XML和C#,空余时间正在重写3D8小卡的函数库。

原先的方法中,主要使用XPath语句,利用preceding-sibling节点,获取不重复的Node,随后使用DOM删除重复项。而随着XML文档越变越大,在生成XPathNodeIterator变得越来越费劲,因为基本是按照树形的结构,将整个XML文档保存在内存里面。而且,只能根据特定的索引值,进行筛选,无法进行多字段判断(其实也写出来了,但是执行起来一样老不见动静……)。对于小文档或许还好,而一旦文档到达一定的大小,一个4M大小的Xml文档,光处理这一部花去20分钟左右时间,简直Unbelievable。而手边还有一个16M的Xml要进行去重处理。

虽然使用Xml就是为了它良好的结构描述性,但是谁巴不得操作它和数据库一样轻松快捷呢?

所以回头用XmlTextReader又写了一个Xml文档去重的函数。XmlTextReader使用数据流的方式处理XML文档,内存的占用就小了很多,而且不是感觉跟死掉一样一点反应都没有。这个函数适用于结构简单的XML文档,例如:



 
 
 
 


函数直接跳过索引值的取用,直接对所有属性值进行比较。如果出现完全重复节点,则不导出至新的XmlDocument。不过随着文档越来越大,每次进行当前节点是否已经导入的搜索时间就会不断延长,似乎目前没什么解。不过比XPathNodeIterator强很多啦~

using System.IO;
using System.Xml;

static public void RemoveDuplicateNode(string sXmlUri, string sParentNodeName, string sChildNodeName)
{
	AguXML.CreateXml("Temp.xml", sParentNodeName);
	XmlDocument xDoc = new XmlDocument();
	xDoc.Load("Temp.xml");

	XmlNode xNodeDest = xDoc.SelectSingleNode(sParentNodeName, null);

	XmlTextReader xtr = new XmlTextReader(sXmlUri);
	long lCounterE = 0, lCounterT = 0; 
	
	Console.Write("\n");
	while (xtr.Read())
	{
		if (xtr.NodeType == XmlNodeType.Element && xtr.Name == sChildNodeName)
		{
			lCounterT++;
			XmlNode xNode = AguXML.GetNodeFromXml(xtr.ReadOuterXml());

			string sCondition = string.Empty;
			foreach (XmlAttribute xa in xNode.Attributes)
			{
				sCondition += string.Format("@{0}=\"{1}\" and ", xa.Name, xa.Value);
			}
			sCondition = sCondition.Substring(0, sCondition.Length - 5);                    

			XmlNode xNodeCheck = xDoc.SelectSingleNode(string.Format("{0}/{1}[{2}]", sParentNodeName,sChildNodeName, sCondition));

			if (xNodeCheck == null)
			{
				lCounterE++;
				xNodeDest.AppendChild(xDoc.ImportNode(xNode, true));
			}
			Console.Write("\r{0} / {1}", lCounterE, lCounterT);
		}
	}
	xtr.Close();
	xtr = null;

	xDoc.Save(sXmlUri);
	File.Delete("Temp.xml");
} 
static public void CreateXml(string sUri, string sRootElement);

的函数代码,请参见本文

关于aGuegu

向着更高的逼格
此条目发表在C#, XML分类目录,贴了, , , , 标签。将固定链接加入收藏夹。
  • jz0410

    AguXML是什么????????

    • 自己写的一个XML处理类吧