如果我这样做
XPathDocument doc = new XPathDocument("filename.xml");
是否将整个文档加载到内存中?我正在编写一个手机应用程序,该文档可能会存储大量不需要同时加载的数据。手机通常没有太多的内存!
答案 0 :(得分:5)
是的,整个XML文档都在内存中表示。
一种解决方案是将大型XML文档拆分为许多较小的文档。
或者,您也可以编写自己的XmlReader
来忽略不需要的子树。您可以将此XmlReader
作为参数传递给XpathDocument()
构造函数 - 需要将其伪装为TextReader
。
答案 1 :(得分:2)
您可能想要更像System.Xml.XmlReader的内容。
答案 2 :(得分:1)
https://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathdocument.aspx
“使用XPath数据模型提供XML文档的快速,只读,内存中表示。”
答案 3 :(得分:1)
您可能希望查看LINQ to XML的XStreamingElement:
表示支持延迟流输出的XML树中的元素。
此类允许您创建XML 支持延迟流式传输的树 输出。您可以使用此类进行创建 一个非常类似的XML树 使用创建XML树 的XElement。但是,有一个 根本区别。当你使用 LINQ查询指定内容的时候 使用XElement创建XML树, 查询变量在。处迭代 构建XML树的时间, 并添加了查询结果 到XML树。相比之下,当你 使用创建XML树 XStreamingElement,对它的引用 查询变量存储在XML中 树没有被迭代。查询 仅在序列化时迭代。 这允许您创建更大的XML 树木虽然保持较小 记忆足迹。
如果您是从输入流式传输 来源,如文本文件,然后你 可以读取一个非常大的文本文件,和 生成一个非常大的XML文档 同时保持小记忆 足迹。
答案 4 :(得分:-1)
您可能想尝试其他构造函数XPathDocument(stream)。流式传输文档不会占用太多内存。
也许你不想看看Linq to XML,因为与使用SAX / DOM解析相比,编码和制作更漂亮的代码更容易,更快。请参阅此帖子:How to Store data without using Database and how to retrieve them?