我想使用 XML 来存储一些数据。但是当我想获取插入到那里的最后一个数据时,我不想读取完整文件,也不想在那里添加新数据时重写完整文件。java中有没有一种标准的方法来解析xml文件,而不是从头开始,而是从头开始。因此,例如 SAX 或 StaX 解析器将首先遇到最后一个关闭根标记,而不是最后一个标记。或者,如果我想这样做,我应该像读/写常规文本文件一样读写所有内容?
3 回答
从根本上说,XML 是一个糟糕的表示选择。这种格式本质上是这样“包含”的,我还没有看到任何鼓励您反对这种格式的 API。
选项:
- 完全选择不同的格式(例如使用数据库)
- 而是创建许多小的 XML 文件——每个文件都是独立的。当您想要全部数据时,请读取所有文件
- 每次只需吞下命中并读/写整个文件。
我找到了一个很好的主题,其中包含我想要的示例解决方案。这个链接:http ://www.oreillynet.com/xml/blog/2007/03/parsing_xml_backwards.html 似乎XML不是很好的文件格式来实现我想要的。没有标准的解析器可以从结尾而不是开头解析 XML。
最好的解决方案可能是将所有 xml 数据存储在一个文件中,该文件包含许多 xml 文件内容的组合。每行存储单独的 XML 内容。该文件本身不是格式正确的 XML,但每一行都包含格式正确的 xml,我将使用标准 xml 解析器(StaX)对其进行解析。
这样我就可以只读取文件末尾的行并将新数据附加到文件末尾。当我需要全部数据或仅部分数据时,我会读取所有行或其中的一部分。可能我也可以从文件末尾实现分页,因为文件可能很大。
为什么每行都有 XML?我认为使用 API 来解析它很容易,并且在 xml 中存储数据而不是仅仅用一些符号分隔行中的值是人类可读的。
为什么不使用 sax/stax 并仅处理您的最后一个条目?是的,它需要打开并浏览整个文件,但至少与加载整个 DOM 树相比,它相当有效。
如果不这样做,我认为您无法使用 XML 作为源来完成您所要求的事情。
除了 Jon Skeet 在他的回答中提供的之外,另一种选择是保持相同的格式,但首先插入最新的条目,并在您阅读条目后立即停止处理文件。