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

简介: 原文:XML数据读取方式性能比较(一)  几个月来,疑被SOA,一直在和XML操作打交道,SQL差不多又忘光了。现在已经知道,至少有四种常用人XML数据操作方式(好像Java差不多),不过还没有实际比较过这些方式各有哪些特点或优劣。
原文: 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了。

目录
相关文章
|
XML 数据采集 存储
使用Java和XPath在XML文档中精准定位数据
在数据驱动的时代,从复杂结构中精确提取信息至关重要。XML被广泛用于数据存储与传输,而XPath则能高效地在这些文档中导航和提取数据。本文深入探讨如何使用Java和XPath精准定位XML文档中的数据,并通过小红书的实际案例进行分析。首先介绍了XML及其挑战,接着阐述了XPath的优势。然后,提出从大型XML文档中自动提取特定产品信息的需求,并通过代理IP技术、设置Cookie和User-Agent以及多线程技术来解决实际网络环境下的数据抓取问题。最后,提供了一个Java示例代码,演示如何集成这些技术以高效地从XML源中抓取数据。
371 7
使用Java和XPath在XML文档中精准定位数据
|
12月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
147 1
|
XML 前端开发 数据格式
BeautifulSoup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据
【5月更文挑战第10天】BeautifulSoup 是 Python 的一个库,用于解析 HTML 和 XML 文件,即使在格式不规范的情况下也能有效工作。通过创建 BeautifulSoup 对象并使用方法如 find_all 和 get,可以方便地提取和查找文档中的信息。以下是一段示例代码,展示如何安装库、解析 HTML 数据以及打印段落、链接和特定类名的元素。BeautifulSoup 还支持更复杂的查询和文档修改功能。
298 1
|
11月前
|
XML Web App开发 数据格式
HTML 页面显示 XML 数据
10月更文挑战第2天
|
11月前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
2040 0
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
456 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
XML 缓存 JavaScript
优化Java中的XML解析性能
优化Java中的XML解析性能
|
XML 存储 JavaScript
50. 【Android教程】xml 数据解析
50. 【Android教程】xml 数据解析
165 1
|
Java 数据库连接 mybatis
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)