背景

这几天手上有个活,解析xml,众所周知xml的解析方法有:

  1. DOM
  2. SAX
  3. linq to xml
  4. 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>

xml下载链接

测试代码

统计时间(只是粗略统计了一下运行时间)

 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读取方法比较的更多相关文章

  1. DOM、SAX、JDOM、DOM4J四种XML解析方法PK

    基础方法(指不需要导入jar包,java自身提供的解析方式):DOM.SAXDOM:是一种平台无关的官方解析方式   --优点:          (1)形成了树结构,直观好理解,代码更易编写     ...

  2. asp.net写入读取xml的方法

    添加命名空间 using System.Xml; 我自己的代码(添加其中的节点) XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(Server.M ...

  3. winform,xml读取与写入

    创建两个xml文件,一个 xml做为模板配置项,另一个做为临时接收数据. private static string localPath = System.Environment.CurrentDir ...

  4. Java获取路径方法&相对路径读取xml文件方法

    (1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI ...

  5. JAVA文件的两种读取方法和三种写入方法

    在使用java对文件进行读写操作时,有多种方法可以使用,但不同的方法有不同的性能. 此文对常用的读写方法进行了整理,以备不时之需. 1.文件的读取 主要介绍两种常用的读取方法.按行读取和按字符块读取. ...

  6. python之xml 文件的读取方法

    ''' xml 文件的读取方法 ''' #!/usr/bin/env python # -*- coding: utf- -*- import xml.etree.ElementTree as ET ...

  7. JAVA常用的XML解析方法

    转并总结自(java xml) JAVA常用的解析xml的方法有四种,分别是DOM,JAX,JDOM,DOM4j xml文件 <?xml version="1.0" enco ...

  8. Linq to XML 读取XML 备忘笔记

    本文转载:http://www.cnblogs.com/infozero/archive/2010/07/13/1776383.html Linq to XML 读取XML 备忘笔记 最近一个项目中有 ...

  9. C#基础巩固(3)-Linq To XML 读取XML

    记录下一些读取XML的方法,以免到用的时候忘记了,还得花时间去找. 一.传统写法读取XML 现在我有一个XML文件如下: 现在我要查找名字为"王五"的这个人的 Id 和sex(性别 ...

随机推荐

  1. SuperMap iServer Ubuntu 开机自启动脚本

    在/etc/init.d/文件夹里面设置相关的文件 1.为了保证创建文件的读写权限与默认一致,我们只需要cp一个默认的启动文件即可 2.删除iserver里面的所有信息 提示:直接执行“:1,$d” ...

  2. Alvin

    Alvin Zhao 東京都 港区虎ノ門2-10-4 ホテルオークラ東京 M 663 電話番号: 0335820111

  3. iOS之自动调节输入文本框的高度

    //自动调节输入文本框的高度 - (void)textViewDidChange:(UITableView *)textView{ float height; if ([[[UIDevice curr ...

  4. python之局部变量引用赋值前的结果

    通过正则表达式,实现加减 昨晚在做计算器的时候,被一个BUG搞懵比了.现在再看看,发现我好小白啊~~ #++- num = input("please input:") sa = ...

  5. jQuery对表格的操作及其他应用

    表格操作 1.隔行变色:对普通表格进行隔行换色:单击显示高亮样式:复选框选中高亮 <!DOCTYPE html> <html> <head> <meta ht ...

  6. Windows下使用Xshell建立反向隧道

    反向隧道是一个进行内网穿透的简单而有用的方法.在Linux下通过OpenSSH和AutoSSH可以很容易地建立稳定的反向隧道.但是在Windows下,还能看到有人特意装个Cygwin来运行这些工具…… ...

  7. Oracle数据库迁移

    1 在数据迁移时,用户首先有权限修改数据库,并且进行表空间创建.删除等权利 例如: select * from dba_tab_privs where grantee='SCOT'; ---查看SCO ...

  8. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理9

    前两天因有事就没来得及写.今天刚刚好空了.这次写的是对角色和管理员对页面按钮之间的控制.先看页面效果 说明:先根据角色设置好角色的权限,然后管理员在对应的角色下的权限去设置其权限. 在设置角色权限的时 ...

  9. 今天发现一些很有意思的ubuntu命令

    跑火车的sl/LS 终端数字雨cmatrix 可能是名言警句也可能是逗你玩的笑话的fortune/fortune-zh 一只会说话的牛 一只会吟诗的牛 上真牛喽! 炫酷 炫酷到这里了!!!

  10. Transaction详细介绍

    闲暇之时浏览技术站点时,看到了对事物写的很好的一篇文章,看完之后感觉讲的实在是太好了. 原文地址:http://my.oschina.net/huangyong/blog/160012 Transac ...