處理大型xml檔案

來源:互聯網
上載者:User

看到《修改大型 XML 檔案的有效方法》http://www.microsoft.com/china/MSDN/library/data/xml/largexml.mspx這篇文章已經有一段時間了,今天終於騰出手來試了試。

都知道XmlDocument裝載一個xml檔案是將所有內容一下子load進來的,遇到很大的xml檔案,問題就很大,曾經我load一個3mb的檔案,調試時能明顯感覺到消耗的時間。XmlReader好,據說XmlReader只是使用幾十K(?)的記憶體,順序讀進來的,可是是唯讀。

msdn這篇文章就是講如何用XmlReader和XmlWriter來處理大型xml檔案的。我寫了如下的代碼測試了一下,中間省去了一些這篇文章使用的XmlNameTable和XmlValidatingReader等。

這個是用XmlReader和XmlWriter處理
  private void button1_Click(object sender, System.EventArgs e)
  {
   System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToString() + " " + DateTime.Now.Millisecond.ToString());
   File.Copy("ResourceList.xml", "Temp.xml", true); // 因為要更新,先copy一個副本
   XmlTextReader reader = new XmlTextReader("Temp.xml");
   reader.WhitespaceHandling = WhitespaceHandling.Significant;
   reader.MoveToContent();

   StreamWriter sw = new StreamWriter("ResourceList.xml", false, System.Text.Encoding.UTF8); // 建立writer
   XmlWriter xw = new XmlTextWriter(sw);
   xw.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
   reader.Read();
   do
   {
    if(reader.Name == "RESOURCE")
     xw.WriteStartElement("RESOURCE");
    else if(reader.Name == "CTNO")
     xw.WriteElementString("CTNO", reader.ReadString());
    else if(reader.Name == "ITMNUM")
     xw.WriteElementString("ITMNUM", reader.ReadString());
    else if(reader.Name == "RESTYP")
     xw.WriteElementString("RESTYP", reader.ReadString());
    else if(reader.Name == "RESNAM")
    {
     if(reader.ReadString().Equals("I99000000001")) // 這裡做比較,並替換內容
      xw.WriteElementString("RESNAM", "Hello");
     else
      xw.WriteElementString("RESNAM", reader.ReadString());
    }
    reader.Read();   
    if(reader.Name == "RESOURCE")
    {
     if(reader.NodeType == XmlNodeType.EndElement)
     {
      xw.WriteEndElement();
      reader.Read();
     }
    }
   }while(reader.NodeType == XmlNodeType.Element);

   xw.Close();
   reader.Close();
   System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToString() + " " + DateTime.Now.Millisecond.ToString());
  }

下面是用XmlDocument來處理這個檔案
  private void button2_Click(object sender, System.EventArgs e)
  {
   System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToString() + " " + DateTime.Now.Millisecond.ToString());
   XmlDocument domTemp = new XmlDocument();
   domTemp.Load("ResourceList.xml");
   XmlNode node = domTemp.SelectSingleNode("descendant::RESOURCE[RESNAM='I99000000001']");
   if(node != null)
   {
    node.SelectSingleNode("RESNAM").InnerText = "Hello";
   }
   else
   {
    node = domTemp.SelectSingleNode("descendant::RESOURCE[RESNAM='Hello']");
    if(node != null)
     node.SelectSingleNode("RESNAM").InnerText = "I99000000001";
   }
   domTemp.Save("ResourceList.xml");
   System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToString() + " " + DateTime.Now.Millisecond.ToString());
  }

我的測試用.net framework 1.1,xml檔案大小808KB。
執行結果:
記憶體消耗:因為我不怎麼會用CLR Profiler,不會分析 , 按理說肯定會有不同
執行時間:用xmlreader+xmlwriter,耗時370ms; 用xmlDocument耗時391ms

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.