Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xml批量节点追加问题_C#_Asp.net_Xml_C# 4.0_C# 3.0 - Fatal编程技术网

C# Xml批量节点追加问题

C# Xml批量节点追加问题,c#,asp.net,xml,c#-4.0,c#-3.0,C#,Asp.net,Xml,C# 4.0,C# 3.0,我想生成一个百万条记录的xml文件。为此,我有一个只设置了一个值的示例xml文件。使用这个xml文件填充ramdom值一百万次。 我创建了一个解决方案,但它非常耗时 try { label1.Text = "File creation in progress ..."; Random rnd = new Random(); string sStartupPath = Application.StartupP

我想生成一个百万条记录的xml文件。为此,我有一个只设置了一个值的示例xml文件。使用这个xml文件填充ramdom值一百万次。 我创建了一个解决方案,但它非常耗时

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");
        }
试试看
{
label1.Text=“正在创建文件…”;
随机rnd=新随机();
字符串sStartupPath=Application.StartupPath;
字符串sName=“”;
int标志=0;
XmlDocument XmlFile=新的XmlDocument();
Load(sStartupPath+@.\..\..\BankStatement.xml);
保存(@“C:\XmlData\Bank.xml”);
XmlDocument XmlF=新的XmlDocument();
加载(@“C:\XmlData\Bank.xml”);
长k=Convert.ToInt32(textBox1.Text);
对于(int j=1;j

请给我一个更好的解决方案。

我知道编写XML的最快方法(除了手动构建XML片段)是使用

XmlWriter类是一个抽象基类,提供 仅转发、仅写、非缓存的XML流生成方式。信息技术 可用于构建符合W3C可扩展标准的XML文档 标记语言(XML)1.0(第四版)建议和 XML推荐中的名称空间


关于如何使用抽象XmlWriter类。

对于编写大型XML文件,您应该使用。

我打赌这不仅耗时,而且会占用大量RAM。这是因为您将整个文档保存在内存中,甚至是您已经处理过的节点:-)请参阅我的答案,以获得更有效的方法。是的,但我只在save-in中尝试了一次。使用它生成的节点值是相同的。所以尝试了这种方法+1。对于如此大的XML,在内存中创建副本将非常困难(特别是在x86情况下,在x64上可能还可以)。阅读也不会有多大乐趣:)。是的。我不久前就遇到了这个问题。x64为您提供了内存空间,但仍然非常慢,如果您开始交换…:-(