编辑非常大的xml文件

问题描述:

我想创建一个加载xml文件并让用户编辑它们的文本框。但是,我不能使用XmlDocument来加载,因为这些文件可能非常大。我正在寻找选项来流式传输/加载xml文档,这样我就不会发生内存不足的错误 - 同时,性能也很重要。你能让我知道什么是好的选择?编辑非常大的xml文件

您可能正在寻找一个XmlTextReader

+0

XmlTextReader提供只读访问 - 不是吗?我需要提供编辑xml并将其保存到文件的功能。我应该能够在用户滚动时将块加载到文本框中 - 如果我的方法不正确,则纠正我。谢谢! – Matt 2010-05-20 13:15:59

+0

-1:不推荐使用XmlTextReader。改为使用'XmlReader.Create'。 – 2010-05-23 12:58:16

尝试Scintilla.NET,它比TextBox更好!

http://scintillanet.codeplex.com/

加载文件很简单:

using (TextReader reader = new StreamReader(myFilePath, Encoding.UTF8)) 
{ 
    scintillaDocument.Text = reader.ReadToEnd(); 
} 

或者:

scintillaDocument.Text = File.ReadAllText(myFilePath); 
+0

耶!有人在我的帖子上解开了-1 ... – code4life 2010-05-20 16:18:26

+0

这不是我-1对你,但reader.ReadToEnd()不适用于一些非常大的XML文件。我对Scintillanet并不陌生,但有没有办法将整个文档加载到内存中? – kenny 2010-05-23 15:53:21

+0

@kenny:嗯......我想你会需要一个XmlTextReader,然后将XML的段加载到控件中。为了让用户编辑文档文本,您必须编写一些额外的代码来向前和向后读取文本。我会看看我是否可以发布一些东西。 – code4life 2010-05-24 13:54:09

我也不得不应付大量的XML文件(1 +演出),并且必须解析元素导出到mySql数据库中。我通过使用基于文本的流式阅读器取得了成功。我所做的就是继续阅读块,直到我不得不根据已知

`<perRecordTag>` 

    <other data/node elements> 

`</perRecordTag>` 

然后一个XML的一个完整的单“记录”,我会做一个XMLDocument从字符串读取(领先后尾随的记录)剥离。然后,我可以解析,审查,无论是哪一个单一的记录,并继续前进。

显然,我不得不保留所有在xml记录结束后开始下一个读取记录元素的开始,但这没有问题。

我有类似的事情与CSV文件数据做类似的事情。

DRapp是正确的,它可能是最简洁的方式来处理这种情况,假设用户不希望在一次打击中读取根级别的所有内容。

理论上所有你需要小心的是打开或关闭的东西,但是你可以将这个核心信息存储在一个字符串中,它不应该太笨重。

作为DRapp,建议您只需将数据加载到流中,并使用一些仔细的位置管理,您应该可以读写。

你最大的问题是,如果说在点x你想用一些不同长度的数据替换节点y中的数据,你最终会在文件中产生空隙,或者你会覆盖下一个节点/ a它的一部分。

因此,每次创建chnage时,都需要将文件流式传输到另一个文件,直到编辑开始,然后在编辑中进行流式处理,然后在文件的其余部分进行流式处理。

您应该可以使用流读取器和流编写器对象完成所有这些工作,您可以在原始文件上的一个流实例上加上一个流编写器放在第二个临时文件上。

虽然这绝不会太快,纯粹是因为在1.x gig文件中写入更新需要花费时间在硬盘上,并且没有优化会改变这种情况。

+0

好吧......正如你所说的,一个并行输出文件将被用作写入流...读取任何内容,让用户拥有它,然后将结果写回第二个文件。根据需要进行编辑的下一个记录工作。 – DRapp 2010-05-20 16:20:03

您可以使用内存映射文件来处理大文件。请参阅MSDN上的MemoryMappedFile Class。好吧,它水平低,但可以提供帮助。可从.NET 4.

您可以使用支持XMLNameTable的阅读器。它会启用字符串实习,所以如果一个字符串频繁出现在一个文档中,相同的字符串将代表它在你的内存中。您可以尝试一个第三方XML解析器。例如。 Altova XML在公司的产品中使用,所以也许它可以做比内置的.NET类更多的东西。顺便说一句,它是免费的。

+0

非常有趣。 – ScottE 2010-05-20 15:36:42

为什么要把xml读入xmldocument,如果你只是把它推入文本框?

你说这里有多大?你有没有尝试将其流式传输到文本框?现在

sometextarea.Text = System.IO.File.ReadAllText(Server.MapPath("somexml.xml")); 

,将其保存回文件系统是一个不同的故事,特别是如果你希望它是1,有效的XML和2对有效的模式。

+0

ScottE可能暗示(或应该暗示)的一件事是,无论您做了什么,您都可能无法将整个文件整合到文本框中。 – 2010-05-23 12:59:57

我想你在这里试图在你的文本框中做太多。为什么不让用户在用于编辑XML的工具中编辑XML文档?这样的工具甚至可以处理大型XML文件。

然后,当编辑XML时,用户可以将完整的XML文档上传到您的网站。

我还没有用大的文件试过,但你应该看看微软的XML Notepad 2007。它声称在一个3MB文件的第二次加载时间下。

http://www.microsoft.com/download/en/details.aspx?id=7973