gpt4 book ai didi

java - 解析 XML 以获取深层嵌套数据

转载 作者:行者123 更新时间:2023-12-01 14:27:50 25 4
gpt4 key购买 nike

我有一个 XML 文件,其结构如下:

<element1>
<element2>
<element3>
<elementIAmInterestedIn attribute="data">
<element4>
<element5>
<element6>
<otherElementIAmInterestedIn>
<data1>text1</data1>
<data2>text2</data2>
<data3>text3</data3>
</otherElementIAmInterestedIn>
</element6>
</element5>
</element4>
</elementIAmInterestedIn>
<elementIAmInterestedIn attribute="data">
<element4>
<element5>
<element6>
<otherElementIAmInterestedIn>
<data1>text1</data1>
<data2>text2</data2>
<data3>text3</data3>
</otherElementIAmInterestedIn>
</element6>
</element5>
</element4>
</elementIAmInterestedIn>
<elementIAmInterestedIn attribute="data">
<element4>
<element5>
<element6>
<otherElementIAmInterestedIn>
<data1>text1</data1>
<data2>text2</data2>
<data3>text3</data3>
</otherElementIAmInterestedIn>
</element6>
</element5>
</element4>
</elementIAmInterestedIn>
</element3>
</element2>
</element1>

正如您所看到的,我对两个元素感兴趣,第一个元素深深嵌套在根元素中,第二个元素深深嵌套在第一个元素中。文档中有多个(同级)elementIAmInterestedIn 和 otherElementIAmInterestedIn 元素。

我想用 Java 解析这个 XML 文件,并将所有 elementIAmInterestedIn 和 otherElementIAmInterestedIn 元素中的数据放入数据结构或 Java 对象中 - 只要它被组织起来并且我可以访问,这对我来说并不重要稍后再说。

我能够编写一个递归 DOM 解析器方法,对 XML 进行深度优先遍历,以便触及每个元素。我还编写了一个带有 JAXB 注释的 Java 类,该类表示 elementIAmInterestedIn。然后,在递归方法中,我可以检查何时到达 elementIAmInterestedIn 并将其解码到 JAXB 类的实例中。这工作正常,只是这样的对象还应该包含多个 otherElementIAmInterestedIn。

这就是我被困住的地方。如何从 otherElementIAmInterestedIn 中获取数据并将其分配给 JAXB 对象?我见过 @XmlWrapper 注释,但这似乎只适用于一层嵌套。另外,我无法使用@XmlPath。

也许我应该放弃这个想法并使用一种全新的方法。我真的刚刚开始使用 XML 解析,所以也许我忽略了一个更明显的解决方案。您将如何解析这样结构的 XML 文档并以有组织的方式存储数据?

最佳答案

也许您应该使用 SAX 解析器而不是 DOM。当您使用 DOM 时,您会将所有文档加载到内存中,而在您的情况下,您只想读取 2 个字段。这是相当低效的。

使用 sax 解析器,您将只能读取您感兴趣的节点。以下是使用 SAX 解析模型执行任务的伪代码:

1) 继续读取节点,直到获得 <elementInterestedIn>节点

2)在你的类(class)中获取该字段

3) 继续阅读,直到得到 <otherElementInterestedIn>节点

4) 也获取该字段并保存对象。

从 1 到 4 循环,直到到达文档末尾。

如果您尝试这种方法,我建议您首先阅读本文档以了解 SAX 解析器的工作原理,它与 DOM 方法非常不同:How to Use SAX

关于java - 解析 XML 以获取深层嵌套数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17056412/

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