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

其实,这样的函数不久前就写出来,但在实际调用中,依然不是很直观,毕竟牵扯到整条XPath查询语句的的写法。

这两天,进一步改进一下,主要改善就在于将生成XPath的语句也构造进来。不太理解的朋友,可以参考此文

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

static public void RemoveRepeatNode(string sXmlUri, string sParentNodeName, string sChildtNodeName, string sID, XmlDataType xDateType)
{
	XPathDocument xpDoc = new XPathDocument(sXmlUri);
	XPathNavigator xpNav = xpDoc.CreateNavigator();

	// "ItemList/Item[not(@Code=((preceding-sibling::Item)/@Code))]"
	string sExp = string.Format("{0}/{1}[not(@{2}=((preceding-sibling::{1})/@{2}))]", sParentNodeName, sChildtNodeName, sID);
	string sNodeExp = string.Format("{0}/{1}", sParentNodeName, sChildtNodeName);

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

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

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

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

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

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

关于aGuegu

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