zoukankan      html  css  js  c++  java
  • 读取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();
    View Code

             这种方式其实是最原始的读取方法,读取的时候一个一个的节点来读取,节点的类型有很多,比如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();
    View Code

           这种方式其实也是通过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();
    View Code

      这种方式时效率最不高的,在调用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();
    View Code

    第五种:也还是使用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();
    View Code
     

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

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

  • 相关阅读:
    八、比卦
    七、师卦
    六、讼卦
    五、需卦
    力扣-两数之和
    什么是3NF (范式) ?
    SQL事务4个特性
    什么是索引?
    假设把只包含01的数组(如{0,0,1,1,1,0,1,0,0,1})按照升序排序,可以任意交换两个数的位置,请输出最少需要交换的次数。
    找规律并用编程实现如下数列(数值超过10000停止打印) 1,1,2,2,3,2,5,4,8,8
  • 原文地址:https://www.cnblogs.com/monkeyZhong/p/4540373.html
Copyright © 2011-2022 走看看