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 ...
随机推荐
- AntiXSS - 支持Html同时防止XSS攻击
AntiXSS - 支持Html同时防止XSS攻击 跨站脚本攻击(XSS)已经不是什么新鲜的话题了,甚至很多大公司也为此吃尽苦头.最简单直接的防范方法,就是不允许任何html标签输入,对用户输入进行编 ...
- SQLServer 复制中移除和加入公布而不初始化全部项目
-- 若提前"禁止架构更改".新增的列不会自己主动加入大公布.此时应使用 sp_articlecolumn 加入列 EXEC sp_changepublication @publi ...
- 30第二建筑Github Page
从我原来博客的前端传输.链接:http://www.hacke2.cn/create-github-page/ 假设中国每一个程序猿都写博客,那么中国IT届的春天就来了 有同学问我的站点是怎么创建的, ...
- 微通道对接ERP、CRM、OA、HR、SCM、PLM和其他管理系统解决方案
公司现有ERP.CRM.OA.HR.SCM.PLM等管理系统的对接微信公共平台服务 方法1:开放接口 企业开放现有系统数据接口给第三方,或由第三方开发数据接口对接微信公众平台 方法2:获取数据库 企业 ...
- 如何添加地图控件到Windows Phone 8的页面中
原文 如何添加地图控件到Windows Phone 8的页面中 本主题介绍了各种方法来添加一个地图控件到Windows Phone 8的项目.该地图控件在Windows Phone的SDK 8.0的库 ...
- linux tomcat部署含有matlab画图打包的java web程序
首先说下问题:matlab可以把相关算法代码打包成jar文件共java调用,本例使用的jar文件的作用是画图并保存,然后部署在linux的tomcat中进行发布.这里出现了一个问题,具体如下:linu ...
- windows phone (15) UI变换上
原文:windows phone (15) UI变换上 在wp中只要是继承自UIElement 的任何对象都可以应用变换,当然包含Textblock,Rectangle等所有的元素,下面我们使用Tex ...
- 黑马day07 注册案例(二)
1依据index.jsp我们首先制定了注册的功能,当点击注册button什么时候.超链接到注册页面.下面是一个注册jsp页 <%@ page language="java" ...
- 内网port映射具体解释(花生壳)
关于怎样建立服务器的解答. 一.花生壳的作用 首先,我们先来了解一下花生壳的究竟有什么作用.由于ADSL每次拨号上网所获得的IP地址每次都是不同的,花生壳起到的作用就是方便用户訪问我们的server( ...
- android创建自定义对话框
创建如下自定义对话框: JAVA代码 LayoutInflater li = LayoutInflater.from(TagActivity. this); //NOTE final View Te ...