【问题标题】:Parsing XML file from the end of file从文件末尾解析 XML 文件
【发布时间】:2013-08-16 13:28:54
【问题描述】:

我想使用 XML 来存储一些数据。但是当我想获取插入到那里的最后一个数据时,我不想读取完整文件,也不想在那里添加新数据时重写完整文件。 java中有没有一种标准的方法来解析xml文件,而不是从头开始,而是从头开始。因此,例如 SAX 或 StaX 解析器将首先遇到最后一个关闭根标记,而不是最后一个标记。或者如果我想这样做,我应该像读/写常规文本文件一样读写所有内容?

【问题讨论】:

  • 你不能在文件前面添加新数据吗? XML 不是最好的格式,但它具有相当扁平的结构和一些使用偏移量的游戏,您可以实现您想要的。只想指出您定义了语义,即最新条目在您的数据结构中排在第一个还是最后一个
  • 如果我要在文件前面添加新数据,我将重写整个文件来保存它。读操作不错,但写等于创建新的同一个文件。

标签: java xml


【解决方案1】:

从根本上说,XML 是一个糟糕的表示选择。这种格式本质上是这样“包含”的,我还没有看到任何 API 鼓励您反对这种情况。

选项:

  • 完全选择不同的格式(例如使用数据库)
  • 改为创建大量小的 XML 文件 - 每个文件都是独立的。当您想要全部数据时,请读取所有文件
  • 只需吞下命中并每次读/写整个文件。

【讨论】:

  • 你觉得如何,创建大量的 xml 文件并将它们全部放在一个 zip 中是否有效。我是否能够从 zip 中读取单独的文件,而无需解压整个 zip,但只需要一个文件?
  • @trims:是的,这对于阅读来说是相当有效的(假设一个不错的 zip 实现) - 但您不希望每次添加新条目时都必须重新打包 zip 文件。
【解决方案2】:

我找到了一个很好的主题,其中包含我想要的示例解决方案。 此链接:http://www.oreillynet.com/xml/blog/2007/03/parsing_xml_backwards.html 似乎 XML 不是实现我想要的好文件格式。没有标准的解析器可以从结尾而不是开头解析 XML。

可能最好的解决方案是将所有 xml 数据存储在一个文件中,该文件包含许多 xml 文件内容的组合。每行存储单独的 XML 内容。文件本身不是格式正确的 XML,但每一行都包含格式正确的 xml,我将使用标准 xml 解析器(StaX)解析。

这样我将能够从文件末尾读取行并将新数据附加到文件末尾。当我需要整个数据或只需要其中的一部分时,我会读取所有行或其中的一部分。可能我也可以从文件末尾实现分页,因为文件可能很大。

为什么在每一行都使用 XML?我认为使用 API 来解析它很容易,并且将数据存储在 xml 中而不是仅仅用一些符号分隔行中的值是人类可读的。

【讨论】:

    【解决方案3】:

    为什么不使用 sax/stax 并只处理您的最后一个条目?是的,它需要打开并遍历整个文件,但至少与加载整个 DOM 树相比,它相当有效。

    如果做不到这一点,我认为您不能使用 XML 作为源来完成您所要求的事情。

    另一种选择,除了 Jon Skeet 在他的回答中提供的那些,将保持相同的格式,但首先插入最新的条目,并在你完成后立即停止处理文件阅读您的条目。

    【讨论】:

    • 如果文件比读取整个文件大,只找到最新的行会非常低效。是的,它比将整个文件加载到内存中要好得多,但对于仅获取一行仍然非常低效。我认为另一种选择效率更低,因为在文件开头插入某些内容时,我将不得不重写整个文件。也许 xml 不是我想要的最佳格式。
    • @trims:可能不会。您还可以考虑实现自己的 XML 解析器并使用内存映射文件,但这对您来说意味着很多麻烦。我想如果您不需要任何形式的架构验证并且您的格式非常固定,这可能是一个解决方案,但它再次指出 XML 不是您想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2017-06-13
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    相关资源
    最近更新 更多