我想创建一个加载xml文件的文本框,让用户编辑它们。但是,我无法使用XmlDocument加载,因为文件可能非常大。我正在寻找以块的形式流式传输/加载xml文档的选项,这样我就不会出现内存错误 - 同时,性能也很重要。你能告诉我什么是好的选择吗?
答案 0 :(得分:2)
尝试使用Scintilla.NET,它比TextBox好几英里!
http://scintillanet.codeplex.com/
加载文档很简单:
using (TextReader reader = new StreamReader(myFilePath, Encoding.UTF8))
{
scintillaDocument.Text = reader.ReadToEnd();
}
或者:
scintillaDocument.Text = File.ReadAllText(myFilePath);
答案 1 :(得分:2)
如果您正在做的就是将xml推入文本框,为什么还要将xml读入xmldocument呢?
你在这里说的有多大?您是否尝试将其流式传输到文本框中?sometextarea.Text = System.IO.File.ReadAllText(Server.MapPath("somexml.xml"));
现在,将它保存回文件系统是一个不同的故事,特别是如果你希望它是1.有效的xml和2.对模式有效。
答案 2 :(得分:1)
我也不得不处理大型XML文件(1+演出),并且必须解析元素以导入到mySql数据库中。通过使用基于文本的流阅读器,我获得了成功。我做的是继续阅读块,直到我有一个基于已知的
的完整单个“记录”的xml`<perRecordTag>`
<other data / node elements>
`</perRecordTag>`
然后,我会做一个XMLDocument来读取字符串(在记录的前导和尾随之后)被剥离。然后,我可以解析,审查任何单个记录并继续前进。
显然,我必须在xml记录结束后保留所有内容以启动下一个读取记录元素的开头,但这没问题。
答案 3 :(得分:1)
我在使用CSV文件数据时遇到了类似的问题。
DRapp是对的,它可能是解决这种情况最干净的方法,假设用户不希望在一次点击中读取根级别的所有内容。
理论上你需要注意的是打开或关闭的东西,但你可以将这个核心信息存储在一个字符串中,它不应该太笨重。
并且正如DRapp建议您只需将数据加载到流中并通过一些仔细的位置管理,您应该能够读写。
你最大的问题是,如果在x点你想用一些不同长度的数据替换节点y中的数据,你最终会在文件中留一个间隙,否则你会覆盖下一个节点/一部分它的。
因此,每次制作一个chnage时,您需要将文件流式传输到另一个文件,直到编辑开始,然后在编辑中流式传输,然后在文件的其余部分流式传输。
您应该可以使用流阅读器和流编写器对象完成所有这些操作,这些对象位于原始文件上的1个流实例之上,另外还有第二个临时文件上的流编写器。
但它永远不会快,纯粹是因为写一个1.x演出文件的更新需要时间在硬盘上,没有优化会改变它。
答案 4 :(得分:1)
您可以使用内存映射文件来处理大文件。请参阅MSDN上的MemoryMappedFile Class。好的,它的水平很低,但可以提供帮助。可从.NET 4获得。
您可以使用XMLNameTable支持的读者。它将启用字符串实习,因此如果文档中经常出现一个字符串,则相同的字符串将在内存中为您表示。
您还可以尝试第三方XML解析器。例如。 Altova XML用于公司的产品中,因此它可能比内置的.NET类做更多的事情。顺便说一句,它是免费的。
答案 5 :(得分:0)
我认为你在这里的文本框中试图做太多。为什么不让用户在用于编辑XML的工具中编辑XML文档?这样的工具甚至可以处理大型XML文件。
然后,当编辑XML时,用户可以将完整的XML文档上传到您的站点。
答案 6 :(得分:0)
我没有尝试过那么大的文件,但是你应该看看微软的XML Notepad 2007.它声称在3mb文件的第二次加载时间。
答案 7 :(得分:-2)
您可能正在寻找XmlTextReader。