gpt4 book ai didi

Java:处理大型 XML 文件 - 无需编码状态自动机即可提取数据?

转载 作者:行者123 更新时间:2023-12-01 11:53:44 26 4
gpt4 key购买 nike

我没有 Java XML 处理经验。我的同事很快就在 JAXP SAX 解析器上实现了,因此大型 XML 不会加载到内存中,我们可以在流上进行操作。这意味着我们使用以下方法实现了回调接口(interface):

public void startElement(..., String elementName, ...){ ... }
public void characters(char [] buf, int offset, int len) { ... }

实现维护由元素名称和深度堆栈管理的标签层次结构中当前位置的状态。

每个 startElement/endElement 都充满意大利面条 if/case 并注册在 中调用的回调字符方法来决定需要和算法如何提取以及在哪里保存新的部分处理的数据部分。这段代码是通过过滤逻辑倒出来的。实际逻辑更大但并不难。

在每个结束的第二级标签上,如果过滤器做出积极的决定,我们会将收集的数据传递到其他位置,清理当前上下文状态并开始处理另一部分数据。

我们的逻辑很原始 - 如果 lvl2 标签是 person 并且按以下顺序具有子标签:skills/Skill/id 并为 id 指定值> - 提取 lvl3 电子邮件 标签值 + lvl4 标签值地址/城市

此任务不是 XPath,因为我们一次提取多个类别,并且如果我正确理解 XPath 在 DOM 上操作并且不是面向流的。

我看到了 XSLT(一种面向流的语言)的可能用途,但似乎它的范围是从一个 XML 文档生成另一个 XML 文档。可以通过 XSLT 处理器传输大型文档,以使用描述性 XSLT 源代码构建易于处理的 XML,然后使用 SAX 解析器处理结果数据。但这看起来是个错误的决定。

使用什么 Java 技术从常规结构化大型 XML 流中提取数据,并使用描述性指令(在 XPath 中更好,例如定义从根开始的标记排序并检查标记/属性值的简化语法)何时提取、提取什么以及提供回调扩展点传递提取的数据部分以进行进一步处理?

我的主要目标是通过以描述性方式表达提取规则来使代码更易于维护,并避免编写玩具自定义有限状态自动机来跟踪我们在 SAX 解析器中所处的上下文。

最佳答案

SAX 是老式的,正如您所指出的,您最终会在 startElement 回调中包含大量逻辑。

StAX 是流解析器,我认为它更适合您的用例,因为它允许您从 XML 流中提取事件,因此没有类似 DOM 的要求来加载整个文档,并且您可以获得对 XML 的更多支持比 SAX 方法更语义。 StAX 描述here

关于Java:处理大型 XML 文件 - 无需编码状态自动机即可提取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28593771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com