栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 人工智能 > NLP

XML数据读取方式性能比较(一)

NLP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

XML数据读取方式性能比较(一)

  几个月来,疑被SOA,一直在和xml操作打交道,SQL差不多又忘光了。现在已经知道,至少有四种常用人XML数据操作方式(好像java差不多),不过还没有实际比较过这些方式各有哪些特点或优劣。正好看到网上也没有这方面的实验,偶来总结一下。

  测试开始先读取XML源,用一个比较大的rss文件链接,复制到项目bin/debug目录下。

Stream xmlStream = new MemoryStream(File.ReadAllBytes(path));

   

  一、Xmldocument 方式

代码

1 static IList testXmldocument() 2 { 3     var doc = new Xmldocument(); 4     doc.Load(xmlStream); 5     var nodeList = doc.documentElement.ChildNodes; 6     var lstChannel = new List(nodeList.Count ); 7     foreach (XmlNode node in nodeList) 8     { 9         var channel = new10         {11             Title = node.SelectSingleNode("title").InnerText,12             link = node.SelectSingleNode("link").InnerText,13             Description = node.SelectSingleNode("description").InnerText,14             Content = node.SelectSingleNode("content").InnerText,15             PubDate = node.SelectSingleNode("pubDate").InnerText,16             Author = node.SelectSingleNode("author").InnerText,17             Category = node.SelectSingleNode("category").InnerText18         };19         lstChannel.Add(channel);20     }21     return lstChannel;22 }

  二、XPathNavigator 方式

代码

1 static IList testXmlNavigator() 2 { 3     var doc = new Xmldocument(); 4     doc.Load(xmlStream); 5     var nav = doc.CreateNavigator(); 6     nav.MoveToRoot(); 7     var nodeList = nav.Select("/channel/item"); 8     var lstChannel = new List(nodeList.Count); 9     foreach (XPathNavigator node in nodeList)10     {11         var channel = new12         {13             Title = node.SelectSingleNode("title").Value,14             link = node.SelectSingleNode("link").Value,15             Description = node.SelectSingleNode("description").Value,16             Content = node.SelectSingleNode("content").Value,17             PubDate = node.SelectSingleNode("pubDate").Value,18             Author = node.SelectSingleNode("author").Value,19             Category = node.SelectSingleNode("category").Value20         };21         lstChannel.Add(channel);22     }23     return lstChannel;24 }

  三、XmlTextReader 方式

代码

1 static List testXmlReader() 2 { 3     var lstChannel = new List(); 4     var reader = XmlReader.Create(xmlStream); 5     while (reader.Read()) 6     { 7         if (reader.Name == "item" && reader.NodeType == XmlNodeType.Element) 8         { 9             var channel = new Channel();10             lstChannel.Add(channel);11             while (reader.Read())12             {13                 if (reader.Name == "item") break;14                 if (reader.NodeType != XmlNodeType.Element) continue;15                 switch (reader.Name)16                 {17                     case "title":18                         channel.Title = reader.ReadString();19                         break;20                     case "link":21                         channel.link = reader.ReadString();22                         break;23                     case "description":24                         channel.Description = reader.ReadString();25                         break;26                     case "content":27                         channel.Content = reader.ReadString();28                         break;29                     case "pubDate":30                         channel.PubDate = reader.ReadString();31                         break;32                     case "author":33                         channel.Author = reader.ReadString();34                         break;35                     case "category":36                         channel.Category = reader.ReadString();37                         break;38                     default:39                         break;40                 }41             }42         }43     }44     return lstChannel;45 }

  四、Linq to XML 方式

代码

1 static IList testXmlLinq() 2 { 3     var xd = Xdocument.Load(xmlStream); 4     var list = from node in xd.Elements("channel").Descendants("item") 5                 select new 6                 { 7                     Title = node.Element("title").Value, 8                     link = node.Element("link").Value, 9                     Description = node.Element("description").Value,10                     Content = node.Element("content").Value,11                     PubDate = node.Element("pubDate").Value,12                     Author = node.Element("author").Value,13                     Category = node.Element("category").Value14                 };15     return list.ToList();16 }

  测试结果:

XmlDocment    47ms    XPathNavigator    42ms    XmlTextReader    23ms    Xml Linq    28ms

  小结一下自己的认识,Xmldocument的操作基本按W3C的DOM操作方式,不过要将全部节点解析成对象加载到内存中,往往造成很大浪费。所以微软自己的编程规范也不推荐用它。这里由于读取了所有节点,可能因此性能和Navigator方式相差不大。在三种随机读取方式中,Xml Linq性能最高,只是方法名有点别扭。XmlTextReader方式是所谓的SAX,只读向前,无疑性能最高,不过实现上麻烦了不少,要比较精确的控制访问逻辑,也无法用匿名类存储数据。

  .Net 3.5发布Xml Linq可以很好地取代前两种方式,通常情况下,最好用它。只有个别场合,如果对性能要求极高,或者读取Xml数据量太大不能一下子下载或读取到内存中,那就只好痛苦委身于XmlTextReader了。

以上就是XML数据读取方式性能比较(一)的内容,更多相关内容请关注PHP中文网(www.kaotop.com)!

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号