在XML中从一堆值中,把不重复的值列出来。
XML文档如下:
<Items>
<Item name="A" />
<Item name="B" />
<Item name="A" />
<Item name="C" />
<Item name="B" />
</Items>
为了找到不同的name,可以用下面的方法:
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
foreach(XmlNode node in doc.DocumentElement.SelectNodes("Items/Item[not(@name=preceding-sibling::Item/@name)]/@name"))
  {
Console.WriteLine(node.Value);
}
//3800个Item时耗时15秒
在XPath 1.0里运行无误,但是当记录很多时发现实际执行效率比较低,甚至不如自己写一个循环遍历整个节点,如下:
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
string tmpName = "";
foreach(XmlNode node in doc.DocumentElement.SelectNodes("Items/Item/@name"))
  {
if(tmpName != node.Value)
 {
tmpName=node.Value;
Console.WriteLine(node.Value);
}
}
//3800个Item时耗时8秒
最后,用XPathDocument XPathNavigator对一个超过3500条记录的Xml文档中的属性直接进行遍历("Items\Item\@name"),找到不重复的属性值,耗时不到1秒:
XPathDocument doc = new XPathDocument(xmlString);
XPathNavigator nav = doc.CreateNavigator();
XPathNodeIterator ni = nav.Select("/Items/Item/@name");
string tmpName = "";
while(ni.MoveNext())
  {
if(tmpName != node.Value)
 {
tmpName=node.Value;
Console.WriteLine(node.Value);
}
}
//3800个Item时耗时不到1秒
从15秒到不到1秒钟,虽然都最终实现了目的,但是效率却是天壤之别,写程序的乐趣或许在这里吧。 |