【问题标题】:How does StAX handle XML modificationsStAX 如何处理 XML 修改
【发布时间】:2016-11-10 15:07:29
【问题描述】:

可以使用 StAX 修改 XML 文件。但我想了解的是 -
--> StAX 是否可以在遇到事件时更新 XML 文档。如果是这样,那么就没有很大的内存占用了。
示例 - 如果我正在读取 Customers.xml 文件并且我需要更改从 StateName 到 StateCode 的每个客户的状态信息。然后当我遇到内容-
<State>California</State>我想改成<State>CA</State>

因此,StAX 确实可以在读取<State>California</State> 后立即对源文件进行修改,并且只有在此之后解析器才会继续处理下一个客户记录。 因此,当读取第二个客户记录时,第一个客户状态已经在 xml 中更新为状态代码。


--> 它是否通过临时跟踪要进行的更改来处理更新,并在解析整个文档后一次性更新整个文档。在这种情况下,我猜如果对大型文档(比如 10GB XML 文件)进行太多更改,将会占用大量内存。
示例继续 - 因此,当处理第二个客户时,StAX 知道第一个客户的状态字段需要更新,但它会推迟更新,直到读取所有客户记录。它可以使用一些内存机制来跟踪需要更新到 XML 中的内容。

【问题讨论】:

  • 请澄清你的第一句话。显示一些示例代码。你的意思是就地改变?我敢肯定 StAX 不可能做到这一点。
  • @vanje,我不是在 StAX 中编程,但我正在评估它以供我的团队使用它来读取和修改大型 xml 文件 (1GB+)。但我绝对可以澄清这个问题。正在编辑问题以使其更清楚。

标签: java xml sax stax


【解决方案1】:

您无法使用 StAX 就地更改 XML 文件,但您可以读取文件、写入另一个文件并即时应用更改。修改后的 StAX 事件(包括更改)会立即写入目标文件(内部缓冲目的除外)。

因此,您的 XML 文件的大小或更改的数量并不重要。

如果您的更改依赖于 XML 中的其他部分,那么它会变得更加困难。然后,您可以分两遍处理 XML 文件。第 1 步用于收集更改所需的所有信息,第 2 步用于使用第 1 步中收集的信息应用更改。 或者,您可以使用完全不同的方法,例如 XML 数据库(例如 BaseX),并使用 XQuery 应用您的更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2013-05-04
    • 2020-11-07
    • 2017-06-07
    • 2016-02-04
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多