几个月来,疑被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了。

转帖地址:http://www.cnblogs.com/XmNotes/archive/2010/08/12/1796162.html

转载于:https://www.cnblogs.com/jvstudio/archive/2010/08/12/1797809.html

XML数据读取方式性能比较(一)相关推荐

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

    地址:http://www.cnblogs.com/XmNotes/archive/2010/08/12/1796162.html 转载于:https://www.cnblogs.com/Music/ ...

  2. TensorFlow数据读取方式:Dataset API,以及如何查看dataset:DatasetV1Adapter的方法

    TensorFlow数据读取方式:Dataset API Datasets:一种为TensorFlow 模型创建输入管道的新方式.把数组.元组.张量等转换成DatasetV1Adapter格式 Dat ...

  3. OJ平台常用数据读取方式

    OJ平台常用数据读取方式 1.C格式 读取判断: scanf函数返回值: 1.大于0时,表示正确接收的参数个数. 2.等于0时,表示输入不匹配,无法正确输入任何值. 3.等于-1时,表示EOF(end ...

  4. XML 数据 BCP方式大批量的上传--学习(一)

    1.是用xml数据,来进行解析上传数据. 2.例如: 3.  <Batch batchNo="20100617">           <Code Code=&q ...

  5. TensorFlow全新的数据读取方式:Dataset API入门教程

    Dataset API是TensorFlow 1.3版本中引入的一个新的模块,主要服务于数据读取,构建输入数据的pipeline. 此前,在TensorFlow中读取数据一般有两种方法: 1.使用pl ...

  6. OleDbDataReader快速数据读取方式

    查询得到OleDbDataReader后,有三种方式支持数据读取,如下: //方法一**速度中等 OleDbDataReader reader = command.ExecuteReader(); w ...

  7. USB Device 数据读取方式的研究

    作者:Sam (甄峰)   sam_code@hotmail.com 随着越来越多的设备通过USB接口与主机连接,我们需要读取USB设备的数据.现就几种不同读取USB Device Data的方法进行 ...

  8. 好强一个Julia!CSV数据读取,性能最高多出R、Python 22倍

    木易 发自 凹非寺  量子位 报道 | 公众号 QbitAI 工欲善其事,必先利其器. 一项便捷且高效的语言对于数据工作者来说是至关重要的. 目前,数据科学绝大多数使用的是R.Python.Java. ...

  9. XML数据读取——Digester简单使用

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

最新文章

  1. Spring并发访问的线程安全性问题
  2. 面试高频题:Hash一致性算法是如何解决数据倾斜问题的?
  3. 学生信息管理系统小结
  4. 如何在Panel中嵌入子窗体
  5. Servlet 和Filter的生命周期
  6. docker搭建webug4.0并——示范.支付漏洞,邮箱轰炸
  7. unity 彩带粒子_iOS动画开发----粒子系统---彩带效果
  8. java rtree源码_rtree R树用java实现的源代码,欢迎广大用户学习交流 Applet 272万源代码下载- www.pudn.com...
  9. 20165309 实验三 敏捷开发与XP实践
  10. 初学Linux (Linux_note)
  11. 博文视点Open Party第8期
  12. 《Metasploit渗透测试手册》—第3章3.5节在Windows 2003 Server上进行渗透测试
  13. ORA-01033问题:定位redo日志进行不完全恢复启库实战案例
  14. 移动宽带连不上微软服务器,移动宽带有些网站打不开怎么解决?
  15. OpenXML:C#操作PPT文档
  16. webpack配置文件的抽离
  17. sklearn基于轮廓系数来选择n_clusters
  18. R包安装--以4.1.2安装DMwR为例
  19. jQuery+js+css实现键盘按键呼吸灯效果
  20. 使用PageOffice实现文档(word,excel,pdf)在线预览编辑

热门文章

  1. java中的与运算符
  2. leetcode 46 全排列
  3. 133.保护频带 134.流量控制在哪些层实现
  4. 脑植入芯片实现脑机交互,脑神经链会如星链般放大马斯克的光环吗
  5. 甲骨文正式发布Java 14(Oracle JDK 14)
  6. 常说SCI论文有多少篇,那你知道SCI是什么吗?
  7. ibm java_IBM i 上Java 虚拟机简介
  8. 026_CSS内边距
  9. 服务器备份文件ctf,GUET-CTF 题目备份
  10. HTTP代理神器Fidder