2012-07-02 2 views
0

Я хочу создать миллионный файл xml-файла. Для этого у меня есть образец XML-файла с только одним значением set.Using этот xml-файл заполняет ramdom значения миллион раз. Я создал solutin, но это очень много времени one.My код являетсяXml bulk Nodes appending issue

try 
     { 
      label1.Text = "File creation in progress ..."; 
      Random rnd = new Random(); 
      string sStartupPath = Application.StartupPath; 
      string sName = ""; 
      int flag = 0; 
      XmlDocument XmlFile = new XmlDocument(); 
      XmlFile.Load(sStartupPath + @"..\..\..\BankStatement.xml"); 
      XmlFile.Save(@"C:\XmlData\Bank.xml"); 
      XmlDocument XmlF = new XmlDocument(); 
      XmlF.Load(@"C:\XmlData\Bank.xml"); 
      long k = Convert.ToInt32(textBox1.Text); 
      for (int j = 1; j < k; j++) 
      { 
       XmlTextReader objXmlTextReader = new XmlTextReader(sStartupPath + @"..\..\..\BankStatement.xml"); 
       while (objXmlTextReader.Read()) 
       { 
        switch (objXmlTextReader.NodeType) 
        { 
         case XmlNodeType.Element: 
          sName = objXmlTextReader.Name; 
          if (sName == "DataXml") 
          { 
           if (flag == 0) 
            flag = 1; 
          } 
          break; 
         case XmlNodeType.Text: 
          if (flag == 1) 
          { 
           XmlNodeList elemList = XmlFile.GetElementsByTagName(sName); 
           for (int i = 0; i < elemList.Count; i++) 
           { 
            if (elemList[i].Name == "Name") 
             elemList[i].InnerXml = generateNames(); 
            else if (elemList[i].Name == "EmailID") 
             elemList[i].InnerXml = generatemailids(); 
            else 
             elemList[i].InnerXml = rnd.Next(500000).ToString(); 
           } 
          } 
          break; 
         case XmlNodeType.EndElement: 
          sName = objXmlTextReader.Name; 
          if (sName == "DataXml") 
          { 
           if (flag == 1) 
            flag = 0; 
          } 
          break; 
        } 
       } 
       XmlDocument dd = new XmlDocument(); 
       dd.LoadXml(XmlFile.InnerXml); 
       XmlNodeList node=dd.GetElementsByTagName("Customers"); 
       XmlDocumentFragment xfrag = XmlF.CreateDocumentFragment(); 
       xfrag.RemoveAll(); 
       for (int i = 0; i < 1; i++) 
       { 
        xfrag.InnerXml = node[i].InnerXml;       
        XmlF.DocumentElement.FirstChild.AppendChild(xfrag);       
       } 

       XmlF.Save(@"C:\XmlData\Bank.xml"); 

      } 

      label1.Visible = false; 
      MessageBox.Show("File creation success..!"); 
     } 
     catch (Exception ex) 
     { 
      label1.Text = ""; 
      MessageBox.Show("Error Occured"); 
     } 

Пожалуйста, дайте мне лучшее решение.

+1

Держу пари, что это не только отнимает много времени, но и использует много оперативной памяти. –

+0

Да, вы правы. –

+0

Это потому, что вы держите весь документ в памяти, даже узлы, которые вы уже обработали :-) См. Мой ответ для более эффективного способа. –

ответ

2

Самый быстрый способ я знаю, чтобы написать XML (краткое построения фрагментов XML вручную) заключается в использовании XmlWriter

Класс XmlWriter это абстрактный базовый класс, который обеспечивает только вперед, только для записи , не кэшированный способ генерации потоков XML. Он может использоваться для создания XML-документов, которые соответствуют рекомендации W3C Extensible Markup Language (XML) 1.0 (четвертое издание) и Пространства имен в рекомендации XML.

MSDN has a walkthrough о том, как использовать абстрактный класс XmlWriter.

+0

+1. Для такой большой XML-копии, созданной в памяти, будет сложно (особенно в случае x86, может быть хорошо на x64). Чтение было бы не очень весело :). –

+0

Да. Недавно я столкнулся с этим вопросом. x64 дает вам пространство памяти, но оно все еще очень медленное, и если вы начнете своп ... :-( –