读取XML文件的几种方式的效率分析

第一种:使用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) == 0)
14                             {
15                                 xmlValue = new Dictionary<string, string>();
16                             }
17                             else if(string.Compare(reader.LocalName,"NewDataSet",
18                                 StringComparison.OrdinalIgnoreCase) != 0)
19                             {
20                                 key = reader.LocalName;
21                             }
22                             break;
23                         case XmlNodeType.EndElement:
24                             if (string.Compare(reader.LocalName, "MultiTable",
25                                 StringComparison.OrdinalIgnoreCase) == 0)
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[0];
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[0];
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[0];
10             textBox8.Text = ts.TotalMilliseconds.ToString();

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

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

时间: 2024-10-09 01:11:46

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

java读取XML文件的四种方式

java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>河南省郑州市</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>河南省郑州市二七区&

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

解析Xml文件的三种方式 1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用回调函数来实现. 1 class MyDefaultHander extends DefaultHandler{ 2 private List<Student> list; 3 private Student student; 4 5 @Override 6 public void startDo

解析XML文件的几种方式和区别

DOM:处理大型文件时其性能下降的非常厉害.这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问. SAX:不现于DOM,SAX是事件驱动型的XML解析方式.它顺序读取XML文件,不需要一次全部装载整个文件.当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问. STAX:Streaming API for XML (StAX

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

var num = 1;    var str = '1';    var test = 1;    test == num  //true 相同类型 相同值    test === num //true 相同类型 相同值    test !== num //false test与num类型相同,其值也相同, 非运算肯定是false    num == str  //true 把str转换为数字,检查其是否相等.    num != str  //false == 的 非运算    num ==

java读取xml文件的三种方法

xml既简单又标准,值得拥有和学习,好多地方都用的到.假设有这么一个book.xml: <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Copyright w3school.com.cn --> <!-- W3School.com.cn bookstore example --> -<bookstore> -<book category="childre

解析XML文件的两种方式 SAX和DOM

1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 2.XML数据结构 XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据. XML数据格式的功能 数据交换 内容管理 用作配置文件 XML数据结构的语法 声明 节点使用一对标签表示:起始和结束标签. 根节点是起始节点,只有一

UI进阶 解析XML文件的两种方式 SAX和DOM

1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 2.XML数据结构 XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据. XML数据格式的功能 数据交换 内容管理 用作配置文件 XML数据结构的语法 声明 节点使用一对标签表示:起始和结束标签. 根节点是起始节点,只有一

Java读取xml文件的四种方法,及其取得配置文件的方法

xml文件: Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>河南省郑州市</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>河南省郑州市二七区</ADDR&g

JavaWeb读取资源文件的四种方式

1. ServletContext 1. 调用getResourcesAsStream方法获取输入流, 相对于webroot, 不用加/2. 读取任何类型的文件3. *只能在web环境下使用 InputStream in = this.getServletContext().getResourceAsStream("WEB-INF/classes/config/db.properties"); 2. 类加载器 1. 相对于类路径, 可以获取类路径下及其子包路径下的资源文件2. 可以用在