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

原文: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<Object>(nodeList.Count );
7 foreach (XmlNode node in nodeList)
8 {
9 var channel =new
10 {
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").InnerText
18 };
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<Object>(nodeList.Count);
9 foreach (XPathNavigator node in nodeList)
10 {
11 var channel =new
12 {
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").Value
20 };
21 lstChannel.Add(channel);
22 }
23 return lstChannel;
24 }

 

  三、XmlTextReader 方式

代码

1 static List<Channel> testXmlReader()
2 {
3 var lstChannel =new List<Channel>();
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").Value
14 };
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了。

时间: 2024-08-03 12:00:49

XML数据读取方式性能比较(一)的相关文章

webservice返回xml数据读取 XML 数据时,超出最大字符串内容长度配额 (8192)。

问题描述 webservice返回xml数据读取 XML 数据时,超出最大字符串内容长度配额 (8192). webservice返回xml数据读取 XML 数据时,超出最大字符串内容长度配额 (8192).通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额 ,怎么解决?谢谢了 麻烦带具体的步骤代码 解决方案 读取 XML 数据时,超出最大字符串内容长度配额 (8192).读取 X

C# XML数据读取

问题描述 如上图所示,如何用C#读取这个XML数据放在一个数组中呢?谢谢名位大神!这个数据在http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?symbol=sz000050 解决方案 解决方案二:添加引用:usingSystem.Xml.Linq;定义price类:classprice{publicDateTimeDate{get;set;}publicdoubleOpen{get;set;}publicdoubleHigh

flash AS3实现远程服务器xml数据读取解析

周日CG接到一位网路上的朋友的问题,要求用flash ActionScript实现从服务端读取动态生成的数据并且进行解析,输入到用户界面的小程序今天代码放上来与大家分享,实现过程很简单,供初学者学习,也希望老鸟指正. 要求:BS结构下,客户端使用flash从服务端读取动态生成的XML格式数据,并将获取的数据进行解析和发送到界面显示. XML格式:  代码如下 复制代码 <root>  <username uid="ceshi001″>  <title>sdfs

浅析.NET下XML数据访问新机制

xml|访问|数据 一.前言: XML作为Web服务的基石,其重要性自然是不言而喻的,它正日益被开发人员所重视.同时随着各类新兴开发工具的推出,XML数据的访问机制也变得越来越灵活多样..Net框架为开发人员提供了几种新的XML数据访问机制,每种机制都提供了不同的XML数据访问支持.所以对于开发人员而言,选择正确合适的XML数据访问机制变得相当重要,它会影响到项目开发的复杂度以及应用程序的整体效率. 大体来讲,.Net框架为开发人员提供了ADO.Net中的数据集XML数据访问机制和SqlData

iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) 4.SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将对象拆开存储) 5.Core Data(对象型的数据库,把内部环节屏蔽) 二.应用沙盒 每个iOS应用都有⾃己的应⽤沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应⽤必须待在⾃己的沙盒里,其他应用不能访问该沙盒(提示:在IOS8中已经开放访问) 应⽤沙盒的文件系

linux下实现web数据同步的四种方式(性能比较)_Linux

实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享2.rsync +inotify实现web数据同步3.rsync+sersync更快更节约资源实现web数据同步4.unison+inotify实现web数据双向同步 ======================================= 一.nfs实现web数据共享  nfs能实现数据同步是通过NAS(网络附加存储),在服务器上共享一个文件,且服务器

Android网络之数据解析----SAX方式解析XML数据

[正文] 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器获取数据.不过这个时候就有一个问题,这些数据是以什么格式在网络上传输的呢?一般我们都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语言,当另一方受到数据消息后就可以按照相同的结构规格进行解析,从而取出它想要的那部分内容. 在网络上传输数据最常用的格式:XML和Json.本文就来学习一下XML数据的解析,Json格式的数据解析将在下一篇文

Android XML数据的三种解析方式_Android

本篇文章包含以下内容:      XML数据的Dom解析      XML数据的Sax解析      XML数据的Pull解析      Activity中使用三种解析      Sax解析与Pull解析区别 三种解析方式的步骤: 1.在Assets文件夹中模拟创建XML数据 2.创建对应XML的Bean对象 3.开始解析 XML数据的Dom解析 DOM解析XML文件时,会将XML文件的所有内容读取到内存中(内存的消耗比较大),然后允许您使用DOM API遍历XML树.检索所需的数据 一.在As

如何把一个图像存储到XML数据中,并读取出来 by iCeSnaker - Program rhapsody

xml|数据 以前对于XML如何存储数据很感兴趣,特别是看到一个文章说,可以直接用XML代替SQL server2000用来存储数据和交互数据,目前还在研究之中.终于把如何存取图像到xml的代码搞定:) 读取图像 //定义图像源与目标xml文件 string ImgFileName = @"d:\中国移动暴强广告.JPG"; string XmlFileName = @"D:\img.xml"; XmlTextWriter aXmlTextWriter = new