XML数据读取方式性能比较(一)
几个月来,疑被SOA,一直在和XML操作打交道,SQL差不多又忘光了。现在已经知道,至少有四种常用人XML数据操作方式(好像Java差不多),不过还没有实际比较过这些方式各有哪些特点或优劣。正好看到网上也没有这方面的实验,偶来总结一下。
测试开始先读取XML源,用一个比较大的RSS文件链接,复制到项目bin/debug目录下。
Stream xmlStream =new MemoryStream(File.ReadAllBytes(path));
一、XmlDocument 方式
{
var doc =new XmlDocument();
doc.Load(xmlStream);
var nodeList = doc.DocumentElement.ChildNodes;
var lstChannel =new List<Object>(nodeList.Count );
foreach (XmlNode node in nodeList)
{
var channel =new
{
Title = node.SelectSingleNode("title").InnerText,
Link = node.SelectSingleNode("link").InnerText,
Description = node.SelectSingleNode("description").InnerText,
Content = node.SelectSingleNode("content").InnerText,
PubDate = node.SelectSingleNode("pubDate").InnerText,
Author = node.SelectSingleNode("author").InnerText,
Category = node.SelectSingleNode("category").InnerText
};
lstChannel.Add(channel);
}
return lstChannel;
}
二、XPathNavigator 方式
{
var doc =new XmlDocument();
doc.Load(xmlStream);
var nav = doc.CreateNavigator();
nav.MoveToRoot();
var nodeList = nav.Select("/channel/item");
var lstChannel =new List<Object>(nodeList.Count);
foreach (XPathNavigator node in nodeList)
{
var channel =new
{
Title = node.SelectSingleNode("title").Value,
Link = node.SelectSingleNode("link").Value,
Description = node.SelectSingleNode("description").Value,
Content = node.SelectSingleNode("content").Value,
PubDate = node.SelectSingleNode("pubDate").Value,
Author = node.SelectSingleNode("author").Value,
Category = node.SelectSingleNode("category").Value
};
lstChannel.Add(channel);
}
return lstChannel;
}
三、XmlTextReader 方式
{
var lstChannel =new List<Channel>();
var reader = XmlReader.Create(xmlStream);
while (reader.Read())
{
if (reader.Name =="item"&& reader.NodeType == XmlNodeType.Element)
{
var channel =new Channel();
lstChannel.Add(channel);
while (reader.Read())
{
if (reader.Name =="item") break;
if (reader.NodeType != XmlNodeType.Element) continue;
switch (reader.Name)
{
case"title":
channel.Title = reader.ReadString();
break;
case"link":
channel.Link = reader.ReadString();
break;
case"description":
channel.Description = reader.ReadString();
break;
case"content":
channel.Content = reader.ReadString();
break;
case"pubDate":
channel.PubDate = reader.ReadString();
break;
case"author":
channel.Author = reader.ReadString();
break;
case"category":
channel.Category = reader.ReadString();
break;
default:
break;
}
}
}
}
return lstChannel;
}
四、Linq to XML 方式
{
var xd = XDocument.Load(xmlStream);
var list = from node in xd.Elements("channel").Descendants("item")
select new
{
Title = node.Element("title").Value,
Link = node.Element("link").Value,
Description = node.Element("description").Value,
Content = node.Element("content").Value,
PubDate = node.Element("pubDate").Value,
Author = node.Element("author").Value,
Category = node.Element("category").Value
};
return list.ToList();
}
测试结果:
| 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数据读取方式性能比较(一)的更多相关文章
- geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探
在上篇博客(geotrellis使用初探)中简单介绍了geotrellis-chatta-demo的大致工作流程,但是有一个重要的问题就是此demo如何调取数据进行瓦片切割分析处理等并未说明,经过几天 ...
- Android使用webService(发送xml数据的方式,不使用jar包)
Android使用webService可以用ksoap2.jar包来使用.但是我觉得代码不好理解,而且记不住. 所以我查询了好多资料,以及自己的理解.可以用代码发送http请求(发送xml数据)来访问 ...
- OleDbDataReader快速数据读取方式
查询得到OleDbDataReader后,有三种方式支持数据读取,如下: //方法一**速度中等 OleDbDataReader reader = command.ExecuteReader(); w ...
- TensorFlow数据读取方式:Dataset API
英文详细版参考:https://www.cnblogs.com/jins-note/p/10243716.html Dataset API是TensorFlow 1.3版本中引入的一个新的模块,主要服 ...
- XML教程、语法手册、数据读取方式大全
XML简单易懂教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 XML --数据格式的写法 二 Re ...
- XML数据读取——Digester简单使用
>>>>>>>>>>>>>>>>>>>>>>>>> ...
- MYSQL 的数据读取方式
例子: create table T(X bit(8)); insert into T (X) values(b'11111111'); select X from T; 这个时候会发现这个X 是乱码 ...
- TensorFlow全新的数据读取方式:Dataset API入门教程
TensorFlow.data : http://tech.ifeng.com/a/20171109/44752505_0.shtml Pytorch:https://ptorch.com/docs/ ...
- Qt读取JSON和XML数据
QJSON JSON(JavaScript Object Notation)是一个轻量级的数据交换格式; 可以将数据以name/value的形式任意组合; QJson 是一个基于Qt的库, 将JSON ...
随机推荐
- 对付"反盗链"
对付"反盗链" 某些站点有所谓的反盗链设置,其实说穿了很简单, 就是检查你发送请求的header里面,referer站点是不是他自己, 所以我们只需要像把headers的refer ...
- hdu1260(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260 分析:简单dp,dp[i]=min(dp[i-1]+a[i],dp[i-2]); #includ ...
- 二、第一个ExtJS程序:helloExtJS
开发前的准备 下载并解压ExtJS包后,能够得到下图的文件文件夹结构: 在实际开发过程中并不须要全部的文件和文件夹,所需的包括例如以下文件夹就可以: 若使用eclipse进行开发,仅仅需将上述文件拷贝 ...
- Cocos2d-x v3.0正式版尝鲜体验【3】 Label文本标签
Cocos2d-x在新版本号中增加了新的Label API.和以往不同的是,2.x的版本号是通过三个不同的类来创建不同的文本标签,而如今是模仿着精灵的创建方式.一个类创建不同形式的文本,只是核心内容还 ...
- ARM裸编程系列---UART
S5PV210 UART说明 通用异步收发器缩写UART,这是UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER.它被用来传送串行数据.当发送数据,CPU将 ...
- Android LCD(三):Samsung LCD接口篇
关键词:android LCD控制器 Framebuffer PWM 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0 平台:samsung exy ...
- MVC数据验证使用小结
原文:MVC数据验证使用小结 描述:MVC数据验证使用小结 内容:display,Required,stringLength,Remote,compare,RegularExpression 本人最近 ...
- hdu3652(数位dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 题意:求1~n含有13且能被13整除的数的个数. 分析:数位dp,dp数组加一维来维护到pos位 ...
- urses.ascii.ispunct(ch):
Nullege: A Search Engine for Python source code urses.ascii.ispunct(ch): TypeError: 'unicode' object ...
- 使用GraceNote Web API发展Mac发现音乐信息的应用
好久没有写博客,最近各种忙,特别忙里忙,今晚难得清闲.写最近完成下一个博客任务的摘要:使用GraceNote的Web API开发一个查询的音乐信息的应用,事实上,并在这些功能的前GraceNote S ...