第一种:使用XmlReader来读取。

  

  1. Stopwatch sw = Stopwatch.StartNew();
  2. List<Dictionary<string, string>> entityInfo = new List<Dictionary<string, string>>();
  3. using (XmlReader reader = new XmlTextReader(compareXmlName))
  4. {
  5. Dictionary<string, string> xmlValue = null;
  6. string key = string.Empty;
  7. while (reader.Read())
  8. {
  9. switch (reader.NodeType)
  10. {
  11. case XmlNodeType.Element:
  12. if (string.Compare(reader.LocalName, "MultiTable",
  13. StringComparison.OrdinalIgnoreCase) == )
  14. {
  15. xmlValue = new Dictionary<string, string>();
  16. }
  17. else if(string.Compare(reader.LocalName,"NewDataSet",
  18. StringComparison.OrdinalIgnoreCase) != )
  19. {
  20. key = reader.LocalName;
  21. }
  22. break;
  23. case XmlNodeType.EndElement:
  24. if (string.Compare(reader.LocalName, "MultiTable",
  25. StringComparison.OrdinalIgnoreCase) == )
  26. {
  27. if (xmlValue != null)
  28. {
  29. entityInfo.Add(xmlValue);
  30. xmlValue = null;
  31. }
  32. }
  33. break;
  34. case XmlNodeType.Text:
  35. if (xmlValue != null)
  36. {
  37. xmlValue.Add(key, reader.Value);
  38. }
  39. break;
  40. }
  41. }
  42. }
  43. TimeSpan ts = sw.Elapsed;
  44.  
  45. List<Customers> packData = new List<Customers>();
  46. foreach (var item in entityInfo)
  47. {
  48. Customers temp = new Customers();
  49. foreach (var sub in item)
  50. {
  51. if (sub.Key == "CustomerID")
  52. {
  53. temp.CustomerID = int.Parse(sub.Value);
  54. }
  55. else if (sub.Key == "CustomerName")
  56. {
  57. temp.CustomerName = sub.Value;
  58. }
  59. else if (sub.Key == "Description")
  60. {
  61. temp.Description = sub.Value;
  62. }
  63. else if (sub.Key == "Boolean")
  64. {
  65. temp.IsEnabled = sub.Value == "true" ? true : false;
  66. }
  67. }
  68. packData.Add(temp);
  69. }
  70.  
  71. dataGridView3.DataSource = packData;
  72. this.textBox9.Text = ts.TotalMilliseconds.ToString();

这种方式其实是最原始的读取方法,读取的时候一个一个的节点来读取,节点的类型有很多,比如Element类型,EndElement类型,Text类型等等,通过这种方式,我们来读取我们需要的数据。这种方式效率最高。

第二种:使用XmlDocument的方式来读取:

  1. Stopwatch sw = Stopwatch.StartNew();
  2. XmlDocument doc = new XmlDocument();
  3. doc.Load(compareXmlName);
  4. XmlNode root = doc.DocumentElement;
  5. XmlNode child = root.FirstChild;
  6. List<Customers> results = new List<Customers>();
  7. while (child != null)
  8. {
  9. XmlNode grandSon = child.FirstChild;
  10. Customers temp = new Customers();
  11. while (grandSon != null)
  12. {
  13. if (grandSon.Name == "CustomerID")
  14. {
  15. temp.CustomerID = int.Parse(grandSon.FirstChild.Value);
  16. }
  17. else if (grandSon.Name == "CustomerName")
  18. {
  19. temp.CustomerName = grandSon.FirstChild.Value;
  20. }
  21. else if (grandSon.Name == "Description")
  22. {
  23. temp.Description = grandSon.FirstChild.Value;
  24. }
  25. else if (grandSon.Name == "Boolean")
  26. {
  27. temp.IsEnabled = grandSon.FirstChild.Value == "true" ? true : false;
  28. }
  29. grandSon = grandSon.NextSibling;
  30. }
  31. results.Add(temp);
  32. child = child.NextSibling;
  33. }
  34. TimeSpan ts = sw.Elapsed;
  35.  
  36. dataGridView3.DataSource = results;
  37. textBox10.Text = ts.TotalMilliseconds.ToString();

这种方式其实也是通过xmlLoader来构造节点的,xmlLoader里面也是XmlReader完成的任务,这种方式的效率也比较高。

第三种:直接使用DataSet来读取,自动判断Schema信息。

  1. DataSet compareDataSet1 = new DataSet("CompareDataSet");
  2. Stopwatch sw = Stopwatch.StartNew();
  3. //读取架构信息
  4.  
  5. compareDataSet1.ReadXml(compareXmlName, XmlReadMode.Auto);
  6.  
  7. TimeSpan ts = sw.Elapsed;
  8. this.dataGridView3.DataSource = compareDataSet1.Tables[];
  9. textBox7.Text = ts.TotalMilliseconds.ToString();

  这种方式时效率最不高的,在调用ReadXml的时候,也是通过XmlReader来完成的工作,调用XmlLoader来加载数据,加载数据是通过XmlLoader的LoadTable来构造表的数据的。

第四种:也是使用DataSet来读取数据,但是先读取架构信息,并且调用BeginLoadData来关闭通知,索引维护等,这样的速度比第三种要快。

  1. DataSet compareDataSet1 = new DataSet("CompareDataSet");
  2. Stopwatch sw = Stopwatch.StartNew();
  3. //读取架构信息
  4. compareDataSet1.ReadXmlSchema(compareXmlSchemaName);
  5. //防止在修改数据的过程中引发各种约束的检查,并可以提高速度
  6. foreach (DataTable dt in compareDataSet.Tables)
  7. {
  8. dt.BeginLoadData();
  9. }
  10. compareDataSet1.ReadXml(compareXmlName, XmlReadMode.IgnoreSchema);
  11. foreach (DataTable dt in compareDataSet1.Tables)
  12. {
  13. dt.EndLoadData();
  14. }
  15. TimeSpan ts = sw.Elapsed;
  16. this.dataGridView3.DataSource = compareDataSet1.Tables[];
  17. textBox6.Text = ts.TotalMilliseconds.ToString();

第五种:也还是使用DataSet来读取数据,也读取架构信息,但是不调用BeginLoadData方法,在这里,因为没有添加任何的索引,约束等,所以速度和第四种差不多。

  1. DataSet compareDataSet1 = new DataSet("CompareDataSet");
  2. Stopwatch sw = Stopwatch.StartNew();
  3. //读取架构信息
  4. compareDataSet1.ReadXmlSchema(compareXmlSchemaName);
  5.  
  6. compareDataSet1.ReadXml(compareXmlName, XmlReadMode.IgnoreSchema);
  7.  
  8. TimeSpan ts = sw.Elapsed;
  9. this.dataGridView3.DataSource = compareDataSet1.Tables[];
  10. textBox8.Text = ts.TotalMilliseconds.ToString();
 

五种的比较结果,读取10万条数据的结果如下:

http://files.cnblogs.com/files/monkeyZhong/DataSetXML.zip

读取XML文件的几种方式的效率分析的更多相关文章

  1. java读取XML文件的四种方式

    java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...

  2. 解析Xml文件的三种方式及其特点

    解析Xml文件的三种方式 1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用 ...

  3. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  4. Java 读取 .properties 文件的几种方式

    Java 读取 .properties 配置文件的几种方式   Java 开发中,需要将一些易变的配置参数放置再 XML 配置文件或者 properties 配置文件中.然而 XML 配置文件需要通过 ...

  5. 解析xml文件的四种方式

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

  6. Android-----解析xml文件的三种方式

    SAX解析方法介绍: SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备.SAX解析XML文件采用的是事件驱动,也就是说, ...

  7. 【开发笔记】- Java读取properties文件的五种方式

    原文地址:https://www.cnblogs.com/hafiz/p/5876243.html 一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供j ...

  8. Spring 读取XML配置文件的两种方式

    import org.springframework.context.ApplicationContext; import org.springframework.context.support.Cl ...

  9. 解析XML文件的几种方式及其比较

    解析xml文件目前比较流行的主要有四种方式: 1. DOM(Document Object Model)它把整个XML文档当成一个对象加载到内  存,不管文档有多大.它一般处理小文件 2.SAX(Si ...

随机推荐

  1. JVM笔记-temp

    jvm源码分析之堆外内存完全解读 http://lovestblog.cn/blog/2015/05/12/direct-buffer/

  2. JS之路——字符串函数

    JS自带函数concat将两个或多个字符的文本组合起来,返回一个新的字符串.var a = "hello";var b = ",world";var c = a ...

  3. 转:mysql5.6.12 for Linux安装

    原文链接:http://mmicky.blog.163.com/blog/static/1502901542013635317349/ 1:上www.mysql.org下载64位版本mysql5.6. ...

  4. 理解java中的ThreadLocal(转)

    一.对ThreadLocal概述 JDK API 写道: 该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的 ...

  5. RR 和RC 幻读问题

    <pre name="code" class="html">显然 RR 支持 gap lock(next-key lock),而RC则没有gap l ...

  6. 阿里云服务器重启后mysql不能启动的问题

    环境:阿里云ECS服务器上,Ubuntu linux 12.04,64位版.MySQL 5.1. 首先查看/etc/rc.local,可以看到Ubuntu通过/etc/init.d/mysqld脚本启 ...

  7. 设计模式(二): BUILDER生成器模式 -- 创建型模式

    1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...

  8. delphi 写系统日志监控 转

    不久前写了个抓取网页内容的小程序,跑了一晚上,本以为早上起来都抓完了,谁知道程序死掉了,分析半天,才发现用tmemo来记录日志的信息太多了,越积越多,本来memo的容量就不大.对于无法控制信息量的日志 ...

  9. 【转】Contrary to the answers here, you DON'T need to worry about encoding!

    For those goals, I honestly do not understand why people keep telling you that you need the encoding ...

  10. 解决display: inline-block; 4px间隙的全兼容做法

    就拿ul, li标签做例,关键代码如下: ul{ font-size: 0; letter-spacing: -4px; word-spacing: -4px; //解决4px间隙的全兼容做法 } l ...