[XML]删除XML重复节点 | Delete Duplicate Nodes in XML

写了一个函数,用于删除XML文档中的重复节点。

调用方法:

示例:适用于XML文档



	
	
	
	
	


执行函数

funRemoveRepeatNode("ItemList.xml", "ItemList/Item[not(@ID=((preceding-sibling::Item)/@ID))]", "ID", "ItemList/Item");

结果为



	
	

以属性”Value”值为索引值保留第一项。

若执行函数

funRemoveRepeatNode("ItemList.xml", "ItemList/Item[not(@value=((preceding-sibling::Item)/@value))]", "value", "ItemList/Item");

结果为



	
	

原理:XPath会先将XML文档调入内存,所以实际上并没有影响XML Document的实际读写;”preceding-sibling”轴表示之前的同属节点,就保证XPath调用的时候,调用的是唯一值。

using System.Xml;
using System.Xml.XPath;

 private static void funRemoveRepeatNode(string sApplicationXMLUri, string sExp, string sID, string sNodeExp)
{
	XPathDocument xpDoc = new XPathDocument(sApplicationXMLUri);
	XPathNavigator xpNav = xpDoc.CreateNavigator();

	XPathExpression xpExp = xpNav.Compile(sExp);
	xpExp.AddSort("@" + sID, XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number);

	XmlDocument xDoc = new XmlDocument();
	xDoc.Load(sApplicationXMLUri);

	XPathNodeIterator xpIter = xpNav.Select(xpExp);
	while (xpIter.MoveNext())
	{
		string sIDValue = xpIter.Current.GetAttribute(sID, "").ToString();

		XmlNodeList xNodeList = xDoc.SelectNodes(sNodeExp + "[@" + sID + "=\"" + sIDValue + "\"]");

		if (xNodeList.Count > 1)
		{
			for (int i = 1; i < xNodeList.Count; i++)
			{
				XmlNode xNode = xNodeList[i];
				xNode.ParentNode.RemoveChild(xNode);
			}
		}

		Console.WriteLine(sIDValue);                
	}
	xDoc.Save(sApplicationXMLUri);
}

其实功能还可以进一步扩展,变得更加强大。看到常常的一大堆代码,有点不爽,稍微“重构”了一下。

关于aGuegu

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