C# Xml批量节点追加问题
我想生成一个百万条记录的xml文件。为此,我有一个只设置了一个值的示例xml文件。使用这个xml文件填充ramdom值一百万次。 我创建了一个解决方案,但它非常耗时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
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为您提供了内存空间,但仍然非常慢,如果您开始交换…:-(