我有一个问题,我现在已经工作了很长时间。我有一个包含超过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万条记录)?
由于
答案 0 :(得分:2)
首先,我怀疑你滥用XML API。您可以直接使用XmlDocument查询XPath,直接获得结果,而无需先选择记录列表并对其进行迭代。在任何时候你都不需要将XML树的部分转换为字符串。
只要您不介意在应用程序上花费50到500兆字节的RAM,将整个XML文档加载到内存中的方法就可以正常工作。
如果要保存RAM,则应使用XmlReader从磁盘流式传输XML。
答案 1 :(得分:0)
归结为您需要访问数据,因此无论是1个文件中的50,000行,还是50个文件中的1000行,您都拥有相同数量的数据。
没有什么可以阻止您在客户端中使用SQL-Lite或SQL Server Compact。这有很多好处。您可以使用XMLReader将数据解析为数据库中的表。完成此操作后,您现在可以使用SQL引擎查找所需的行,使用连接更容易查找相关行。您也没有在内存中存储大量数据。如果XML可能会发生变化,那么请观察文件中的变化&amp;它会刷新数据库。