【问题标题】:Using JAXB for multiple root XML elements in one file将 JAXB 用于一个文件中的多个根 XML 元素
【发布时间】:2016-01-04 11:00:05
【问题描述】:
考虑具有以下内容的输入 XML 文件:
<organization>
<director>
<fname>Dan</fname>
<lname>Schman</lname>
</director>
</organization>
<organization>
<director>
<fname>fan</fname>
<lname>Heman</lname>
</director>
</organization>
<organization>
<director>
<fname>Ban</fname>
<lname>Sheman</lname>
</director>
</organization>
是否可以使用 JAXB 来解组具有多个根元素的输入文件?有没有更好的工具可以用来实现这一点?
我熟悉将 JAXB 用于包含单个根元素的文件,但是当输入文件具有上面给出的多个根元素时,我该如何进行解组?
【问题讨论】:
标签:
java
xml
jaxb
marshalling
unmarshalling
【解决方案1】:
您输入的“XML”文件不是有效的 XML。 XML 只有一个根元素。 JAXB 只能解组有效的 XML 文件。
我建议使用有效的 XML。
否则您将不得不手动将文档拆分为多个有效的 XML 文档(可能在内存中)。
但这种方法会导致您需要维护更多代码。
【解决方案2】:
最简单的解决方案是将您的 xml 包装到一个像这样的大根元素中
<root>
<organization>
...
</organization>
<organization>
...
</organization>
</root>
然后您可以使用XMLInputFactory 创建一个XMLStreamReader 也循环每个organization 元素并使用 unmashaller 方法解组每个元素:
yourUnmarshaller.unmarshal(XMLStreamReader reader);
【解决方案3】:
有效的 XML 只有一个根元素。
编写一个小型预处理器,将输入的几乎 XML 分块成更小的有效 XML 文档。
【解决方案4】:
文件格式将如我的问题中所述。它有多个 XML(但标签相同)。
我已经解决了这个问题,我正在一次读取XML文件一条消息,即<organization>...</organization>成一个字符串,然后将这个字符串传递给unmarshaller作为
Organisation org = (Organisation) unmarshaller.unmarshal(new StringReader("xml string here"));