1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > XML数据读取方式性能比较(一)

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

时间:2020-12-15 10:27:19

相关推荐

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

XML/RSS教程

XML,数据读取,方式性能

XML/RSS教程

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

传奇引擎源码 sql,ubuntu 压缩软件,攻击tomcat服务器,实时的爬虫,php数组里面求和,seo市场、lzw

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

数据库 源码下载,Ubuntu库版本冲突,新派爬虫箱底座,php zadd,最新seo群lzw

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

模板无忧网站源码,为啥要用ubuntu编程,tomcat7绿色版下载,火山爬虫 路灯下,php路径导入是什么意思,安平seo推广lzw

A、XmlDocument 方式

代码

1 static IList testXmlDocument() 2 { 3var doc = new XmlDocument(); 4doc.Load(xmlStream); 5var nodeList = doc.DocumentElement.ChildNodes; 6var lstChannel = new List(nodeList.Count ); 7foreach (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}21return lstChannel;22 }

B、XPathNavigator 方式

代码

1 static IList testXmlNavigator() 2 { 3var doc = new XmlDocument(); 4doc.Load(xmlStream); 5var nav = doc.CreateNavigator(); 6nav.MoveToRoot(); 7var nodeList = nav.Select("/channel/item"); 8var lstChannel = new List(nodeList.Count); 9foreach (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}23return lstChannel;24 }

C、XmlTextReader 方式

代码

1 static List testXmlReader() 2 { 3var lstChannel = new List(); 4var reader = XmlReader.Create(xmlStream); 5while (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 {17case "title":18 channel.Title = reader.ReadString();19 break;20case "link":21 channel.Link = reader.ReadString();22 break;23case "description":24 channel.Description = reader.ReadString();25 break;26case "content":27 channel.Content = reader.ReadString();28 break;29case "pubDate":30 channel.PubDate = reader.ReadString();31 break;32case "author":33 channel.Author = reader.ReadString();34 break;35case "category":36 channel.Category = reader.ReadString();37 break;38default:39 break;40 }41 }42 }43}44return lstChannel;45 }

D、Linq to XML 方式

代码

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。