【问题标题】:Parsing XML for deeply nested data解析深度嵌套数据的 XML
【发布时间】:2013-06-08 00:41:49
【问题描述】:

我有一个结构如下的 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 和其他ElementIAmInterestedIn 元素。

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

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

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

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

【问题讨论】:

  • 有用于遍历/查询 xml 的 xpath 标准。我没有使用过,所以我无法确保任何事情,但我会说谷歌搜索可能是个好主意
  • 您希望您的 Java 模型是什么样的?您还需要支持将对象写回 XML 吗?
  • 我想理想的情况是有一个代表 elementIAmInterestedIn 的类,其中包含属性的私有变量和任何直接子元素。我想我可以为此使用 JAXB。但是其中一个私有变量必须是代表 otherElementIAmInterestedIn 的另一个类的实例列表。我不需要支持将对象写回 XML。

标签: java dom xml-parsing jaxb nested


【解决方案1】:

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

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

1) 继续读取节点,直到获得&lt;elementInterestedIn&gt; 节点

2) 在您的班级中获取该字段

3) 继续阅读,直到获得 &lt;otherElementInterestedIn&gt; 节点

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

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

如果你尝试这种方法,我建议你先阅读这个文档来了解 SAX 解析器是如何工作的,它与 DOM 方法有很大的不同:How to Use SAX

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-07
    • 2023-03-06
    • 1970-01-01
    • 2020-08-29
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多