我有一个问题,我正在处理相当长的一段时间。我有一个包含超过 50000 条记录的 XML 文件(一条记录有 3 个级别)。我的一个应用程序使用此文件来控制文档发送(该记录包含必须发送给某个人的文档类型等信息)。因此,在我的应用程序中,我将 XML 文件加载到 XmlDocument 中,然后使用 SelectNodes 方法创建一个 XmlNodeList,从中读取我想要的数据。过程是这样的——我们的工人拿人的身份证(简单的条形码)并用条形码阅读器读取它。读取条形码值后,我的应用程序会在 XML 文件中找到具有该 ID 的人员,并将文档的类型存储到字符串变量中。然后工人拿起文件并读取其条形码,如果文档条形码的值与字符串变量中的值匹配,则应用程序记录类型为xxxxxxxx的文档将被发送给ID为yyyyyyyyy的人。这是非常简单的代码,它现在可以完美运行,它的外观是这样的: 在 textBox1_TextChanged 事件上(工作人员读取人员 ID):
foreach(XmlNode node in NodeList){
if(String.Compare(node.Attributes.GetNamedItem("ID").Value.ToString(),textBox1.Text)==0)
{
ControlString = node.ChildNode[3].FirstChild.Attributes.GetNamedItem("doctype").Value.ToString();
break;
}
}
textBox2.Focus();
在 textBox2_TextChanged 事件上(工作人员读取文档条码):
if(String.Compare(textBox2.Text,ControlString)==0)
{
//Create a record and insert it into a SQL database
}
我的问题是 - 我的应用程序将如何处理更大的 XML 文件(我被告知 XML 文件可能多达 500,000 条记录),这种方法是否有效,或者我需要将文件切割成更小的文件。如果我必须削减它,请给我一些代码示例的想法,我尝试这样做:读取整个记录并将其存储到字符串中:
private void WriteXml(XmlNode record)
{
tempXML = record.InnerXml;
temp = "<" + record.Name + " code=\"" + record.Attributes.GetNamedItem("code").Value + "\">" + Environment.NewLine;
temp += tempXML + Environment.NewLine;
temp += "</" + record.Name + ">";
SmallerXMLDocument += temp + Environment.NewLine;
temp = "";
i++;
}
tempXML、temp 和 SmallerXMLDocument 都是字符串变量。
然后在 button_Click 方法中,我将 XML 文件加载到 XmlNodeList 中(再次使用 XmlDocument.SelectNodes 方法),并尝试创建一个大字符串值来保存所有记录,如下所示:
foreach(XmlNode node in nodes)
{
if(String.Compare(node.ChildNode[3].FirstChild.Attributes.GetNamedItem("doctype").Value.ToString(),doctype1)==0)
{
WriteXML(node);
}
}
我的想法是创建一个字符串值(在本例中称为 SmallerXmlDocument),当我通过整个 XML 文件时,只需将该字符串的值复制到一个新文件中。这有效,但仅适用于最多包含 2000 条记录的文件(我的记录不止这些)。那么,如果我需要将文件切割成更小的部分,最好的方法是什么(请记住,XML 文件中可能有多达 50 万条记录)?
谢谢