[英]Edit very large xml files
我想创建一个文本框来加载xml文件并让用户对其进行编辑。 但是,由于文件可能很大,因此无法使用XmlDocument进行加载。 我正在寻找以流方式/分块加载xml文档的选项,这样我就不会出现内存不足错误-同时,性能也很重要。 您能告诉我什么是不错的选择吗?
试试Scintilla.NET,它比TextBox好得多!
http://scintillanet.codeplex.com/
加载文档很容易:
using (TextReader reader = new StreamReader(myFilePath, Encoding.UTF8))
{
scintillaDocument.Text = reader.ReadToEnd();
}
要么:
scintillaDocument.Text = File.ReadAllText(myFilePath);
如果您只是将XML推送到文本框中,为什么还要烦恼将xml读入xml文档呢?
您在这里谈论多少? 您是否尝试过将其流式传输到文本框中?
sometextarea.Text = System.IO.File.ReadAllText(Server.MapPath("somexml.xml"));
现在,将其保存回文件系统是另一回事,特别是如果您希望将其设置为1.有效xml和2.针对模式有效。
我也不得不处理大型XML文件(超过1个演出),还不得不解析元素以导入到mySql数据库中。 通过使用基于文本的流阅读器,我获得了成功。 我要做的是继续读取大块数据,直到我有了一个基于已知的xml的完整单条“记录”为止
`<perRecordTag>`
<other data / node elements>
`</perRecordTag>`
然后,我将做一个XMLDocument来从剥离的字符串中读取(在记录的开头和结尾之后)。 然后,我可以解析,查看任何单个记录,然后继续。
显然,我必须保留xml记录结束后的所有内容,才能开始下一个读取记录元素的开始,但这没问题。
我在处理CSV文件数据时遇到类似的问题。
DRapp是正确的,假设用户不希望一击就能从根目录读取所有内容,这可能是解决这种情况的最干净的方法。
从理论上讲,您需要注意的是打开或关闭的内容,但是您可以将此核心信息存储在字符串中,并且它不会太庞大。
就像DRapp建议的那样,您只需将数据加载到流中,并通过一点点的位置管理就可以读取和写入数据。
您的最大问题是,如果在点x处说要用不同长度的某些数据替换节点y中的数据,则结果要么是文件中有间隙,要么是覆盖下一个节点或其中的一部分。
因此,基本上每次进行更改时,您都需要将文件流式传输到另一个文件中,直到编辑开始的位置,然后再在编辑中流式传输,然后在文件的其余部分中流式传输。
您应该能够使用流读取器和流写入器对象来完成所有这些操作,这些对象位于原始文件的1个流实例的顶部,而第二个临时文件位于一个流写入器的顶部。
不过,这永远不会很快,这纯粹是因为将更新写入1.x gig文件需要花费时间在硬盘上,并且没有优化可以改变这一点。
您可以使用内存映射文件来处理大型文件。 请参阅MSDN上的MemoryMappedFile类 。 好的,虽然级别很低,但可以提供帮助。 可从.NET 4获取。
您可以将阅读器与XMLNameTable支持一起使用。 它将启用字符串插入 ,因此,如果字符串频繁出现在文档中,则相同的字符串将为您在内存中表示它。
您也可以尝试第3方XML解析器 。 例如,公司的产品中使用了Altova XML ,因此它可能比内置的.NET类做更多的事情。 顺便说一句,它是免费的。
我认为您在此处的文本框中尝试执行过多操作。 用户为什么不使用用于编辑XML的工具来编辑XML文档? 这样的工具甚至可以处理大型XML文件。
然后,在编辑完XML后,用户可以将完整的XML文档上载到您的站点。
我没有用过这么大的文件来尝试过,但是您应该看一下Microsoft的XML Notepad2007。它声称在3秒钟的加载时间下,文件大小为3mb。
您可能正在寻找XmlTextReader 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.