无所从来 亦无所去

Krone's Idea

   :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  8 Posts :: 4 Stories :: 0 Comments :: 0 Trackbacks
posted on 2006-04-05 01:22 Krone Cai 阅读(69) 评论(0)  编辑 收藏

公告

昵称:Krone Cai
园龄:6年10个月
粉丝:0
关注:0

搜索

 
 

常用链接

最新评论

阅读排行榜

评论排行榜

推荐排行榜

在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秒钟,虽然都最终实现了目的,但是效率却是天壤之别,写程序的乐趣或许在这里吧。