几种xml读取方法比较
背景
这几天手上有个活,解析xml,众所周知xml的解析方法有:
- DOM
- SAX
- linq to xml
- plinq
测试用xml和生成代码
static void CreateFile()
{
int N = ;
Random rand = new Random();
using (var writer = new XmlTextWriter("VeryHugeXmlFile.xml", Encoding.UTF8))
{
writer.Formatting = Formatting.Indented; writer.WriteStartDocument();
writer.WriteStartElement("Root");
for (int count = ; count <= N; count++)
{
writer.WriteStartElement("Person");
writer.WriteElementString("Id", count.ToString());
writer.WriteElementString("Name", rand.Next().ToString());
writer.WriteElementString("Sex", rand.Next(, ) == ? "男" : "女");
writer.WriteElementString("Age", rand.Next(, ).ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
}
之后会生成类似于下面的xml文件
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Person>
<Id>1</Id>
<Name>897639886</Name>
<Sex>女</Sex>
<Age>80</Age>
</Person>
<Person>
<Id>2</Id>
<Name>2012162696</Name>
<Sex>女</Sex>
<Age>60</Age>
</Person>
<Person>
测试代码
统计时间(只是粗略统计了一下运行时间)
static void Watch(Action<string> way, string file)
{
Stopwatch watch = new Stopwatch(); watch.Start();
way(file);
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
}
DOM
static void DomWay(string file)
{
XmlDocument doc = new XmlDocument();
doc.Load(file); Console.WriteLine(doc.SelectNodes(YOUR-XPATH-HERE).Count); }
SAX
static void SaxWay(string file)
{
using (XmlTextReader reader = new XmlTextReader(file))
{
int count = ;
while (reader.Read())
{
if (reader.Name == "Person" && reader.NodeType == XmlNodeType.Element)
{
reader.Read();
reader.Read(); int? Id = null;
int? name = null;
string sex = null;
int? age = null; if (reader.Name == "Id")
{
Id = reader.ReadElementContentAsInt();
reader.Read();
name = reader.ReadElementContentAsInt();
reader.Read();
sex = reader.ReadElementContentAsString();
reader.Read();
age = reader.ReadElementContentAsInt();
reader.Read();
} if (reader.Name == "Person" && reader.NodeType == XmlNodeType.EndElement)
reader.Read(); if (Id != null && name != null && sex != null && age != null)
{
if (在此设置自定义过滤条件)
count++;
}
}
} Console.WriteLine(count);
}
}
Linq to Xml
static void LinqWay(string file)
{
var root = XElement.Load(file);
var person = from p in root.Elements("Person")
7 where 在此设置自定义过滤条件
8 select id;
Console.WriteLine(person.Count());
}
PLinq to Xml
static void PLinqWay(string file)
{
var root = XElement.Load(file);
var person = from p in root.Elements("Person").AsParallel()
7 where 在此设置自定义过滤条件
8 select id;
Console.WriteLine(person.Count());
}
统计结果
在6核8G内存机器上,测试程序设置为x64和release模式,在xml查询结果相同的情况下取运行时间(ms),没有详细采集cpu和内存数据
两个模式,区别是加了一个素数的判断。
|
Id > 5000 && sex == "男" && age > 15 && age < 50 |
Id > 5000 && sex == "男" && age > 15 && age < 50 && IsPrimeInt(name) |
|
| sax | 13857 | 40010 |
| linq | 27336 | 53760 |
| plinq | 24550 | 28846 |
| dom | 31737 | 0 |
由于dom模式本身xpath模式不支持嵌入函数,所以第二个测试没有采集结果。

小结
sax:速度优先,内存占用少,但是代码复杂度高。
linq:速度较sax慢,但是代码优雅,维护容易
plinq:同上,在非计算密集型模式中,不比linq和sax模式好多少。但是在计算密集下,后来居上
dom:速度落后,但是原生支持xpath,代码最优雅。
内存方面仅是肉眼观察了任务管理器,sax基本内存曲线为水平线,而linq&plinq在load的时候分配内存,可能其内部也是用了dom。
仓促行文,其中必有不实之处,往各位劳神指教。
几种xml读取方法比较的更多相关文章
- DOM、SAX、JDOM、DOM4J四种XML解析方法PK
基础方法(指不需要导入jar包,java自身提供的解析方式):DOM.SAXDOM:是一种平台无关的官方解析方式 --优点: (1)形成了树结构,直观好理解,代码更易编写 ...
- asp.net写入读取xml的方法
添加命名空间 using System.Xml; 我自己的代码(添加其中的节点) XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(Server.M ...
- winform,xml读取与写入
创建两个xml文件,一个 xml做为模板配置项,另一个做为临时接收数据. private static string localPath = System.Environment.CurrentDir ...
- Java获取路径方法&相对路径读取xml文件方法
(1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI ...
- JAVA文件的两种读取方法和三种写入方法
在使用java对文件进行读写操作时,有多种方法可以使用,但不同的方法有不同的性能. 此文对常用的读写方法进行了整理,以备不时之需. 1.文件的读取 主要介绍两种常用的读取方法.按行读取和按字符块读取. ...
- python之xml 文件的读取方法
''' xml 文件的读取方法 ''' #!/usr/bin/env python # -*- coding: utf- -*- import xml.etree.ElementTree as ET ...
- JAVA常用的XML解析方法
转并总结自(java xml) JAVA常用的解析xml的方法有四种,分别是DOM,JAX,JDOM,DOM4j xml文件 <?xml version="1.0" enco ...
- Linq to XML 读取XML 备忘笔记
本文转载:http://www.cnblogs.com/infozero/archive/2010/07/13/1776383.html Linq to XML 读取XML 备忘笔记 最近一个项目中有 ...
- C#基础巩固(3)-Linq To XML 读取XML
记录下一些读取XML的方法,以免到用的时候忘记了,还得花时间去找. 一.传统写法读取XML 现在我有一个XML文件如下: 现在我要查找名字为"王五"的这个人的 Id 和sex(性别 ...
随机推荐
- 【requireJS路径加载】与程序员小卡的交流
这两天正好看到了程序员小卡同学的一篇博客,里面对requireJS路径的解析做了一些说明,里面有点问题待解决,我这里正好知道一点,所以整理成文,不知对小卡同学是否有帮助. http://www.cnb ...
- 使用ssh连接gitHub
github每次pull/push代码时要求推送代码的用户是合法的,所以每次推送时候都要输入账号密码用以验证用户是否为合法用户,而ssh是一种安全的传输模式,可以代替用户的这一"输入账号密码 ...
- GeoEvent使用问题及解决方法整理
假如GeoEvent的部署环境是一个典型的WebGIS架构(Portal+GIS Server),往往会遇到一些问题,例如: 问题:发布的StreamService流服务无法查看. 原因:默认发布的S ...
- 基于Ruby的watir-webdriver自动化测试方案与实施(四)
接着基于Ruby的watir-webdriver自动化测试方案与实施(三) http://www.cnblogs.com/Javame/p/4159468.html 继续 ... ... 首先回忆 ...
- js 随机生成姓名、手机号、身份证号、银行卡号
开发测试的时候,经常需要填写姓名.手机号.身份证号.银行卡号,既要符合格式要求.又不能重复.大家会到网上搜各种生成器.能不能自己写一个简单的生成器呢.下面是随机生成姓名.手机号.身份证号.银行卡号的j ...
- 配置git同时push到两个远端库的简单方法
最近在写一个开源的论坛系统,在发布代码时选择了github和coding这两个平台,我手懒,不想敲两次git push了,所以说突然有了一个很奇怪的需求:用一条git push同时push到两个远端代 ...
- MySQL(三)
MYSQL(三) 上一章给大家说的是数据库的视图,存储过程等等操作,这章主要讲索引,以及索引注意事项,如果想看前面的文章,url如下: MYSQL入门全套(第一部) MYSQL入门全套(第二部) 索引 ...
- 深入解析SQL Server并行执行原理及实践(上)
在成熟领先的企业级数据库系统中,并行查询可以说是一大利器,在某些场景下他可以显著的提升查询的相应时间,提升用户体验.如SQL Server, Oracle等, Mysql目前还未实现,而Postgre ...
- OpenStack 架构 - 每天5分钟玩转 OpenStack(15)
终于正式进入 OpenStack 部分了. 今天开始,CloudMan 将带着大家一步一步揭开 OpenStack 的神秘面纱. OpenStack 已经走过了 6 个年头. 每半年会发布一个版本,版 ...
- js鼠标滚轮事件
不多说,直接上代码. //非ie document.body.onmousewheel = function(event) { event = event || window.event; conso ...