gpt4 book ai didi

c# - 在 C# 中将大型 XML 文件切割成较小的部分

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:08 26 4
gpt4 key购买 nike

我有一个问题,我已经处理了很长时间了。我有一个包含超过 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 万条记录)?

谢谢

最佳答案

首先,我怀疑您在滥用 XML API。您可以查询XmlDocument直接与 XPath立即获得结果,无需先选择记录列表并遍历它们。在任何时候都不需要将 XML 树的部分转换为字符串。

只要您不介意在您的应用程序上花费 50 到 500 兆字节的 RAM,将整个 XML 文档加载到内存中的方法就可以正常工作。

如果你想节省 RAM,你应该使用 XmlReader从磁盘流式传输 XML。

关于c# - 在 C# 中将大型 XML 文件切割成较小的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11325985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com