反序列化XML Java对象的通用解决方案?

时间:2015-12-01 14:07:38

标签: java xml database

在将XML反序列化为Java对象和之后的数据库时,是否有任何通用的解决方案?无需每次都生成和重新编译特定的POJO?

我正在寻找能够像这样反序列化XML的东西:

<books>
  <book>
    <title>My Super Book</title>
    <authors>
      <author>
        <name>Thom A.</name>
      </author>
      ...
    </authors>
  </book>
  ...
</books>

进入通用Java ArrayLists和HashMaps,以某种方式保持对象之间的关系。可能如下:

books = [{
  title: "My Super Book",
  authors: [{
    name: "Thom A."
  },...]
},...]

然后将这些数据库持久存储到表booksauthors中。

更新 XML结构在编译时已知 NOT 。必须在运行时发现它。因此,这将最终导入通用导入,可用于不同类型的XML结构,而无需重新编译或调整程序代码。

更新2: 给出了数据库结构,可以在编译时将其考虑在内。但是,我们可以选择一种解决方案,使我们能够灵活地在运行时更改xml和数据库之间的映射。

2 个答案:

答案 0 :(得分:3)

任务很简单,世纪之交的SAX Java接口将帮助您完成工作。但是你必须自己写。

如果你花了两天时间写这篇文章,那么你现在已经完成了。

问题的难点在于,XML并没有隐含地表现为像JSON那样的地图列表的地图。 JSON比XML简单。

例如,您如何知道元素代表列表的根与地图的对比?你不能在第一次遇到时知道,你必须提前决定。

如何捕获元素属性?他们只是像子元素一样进入地图吗?

这些是关于为什么不能直接为此设置通用实用程序的问题。

但是你知道你的XML,也许你可以有一些“约定优于配置”(即如果元素名称以's'结尾,则可能是列表)在编组过程中充当启发式。

最后,您只需要跟踪堆栈中的一些内容,并决定如何处理数据并走XML树。简单的问题是“现在我有元素名称,它的数据,我该怎么办呢?”将它附加到我当前的地图上?将它附加到我当前的列表中?在少数情况下回答这个问题,你已经完成了。这并不困难,但必须做出只有你能做出的决定。

答案 1 :(得分:1)

看看JAX-B,java&lt; - &gt; XML绑定。这允许您将xml文件转换为java对象。您还可以使用hibernate或JPA将java对象解压缩到数据库中。

JAX-B click

HIBERNATE click

JPA click

修改 您要求的是我个人认为您不会在任何主要库或框架中快速找到的特定功能。我不知道这样的事情是否已经存在。关于在go上更改数据库映射的主题:

每次触发数据库命令时,您都可以读取保存在文件中的某种格式的映射。 con是你会从中获得一点开销,亲是文件可以调整运行时,因此你在文件中描述的映射可以调整运行时。然而,这需要你身边的大量工作。

关于发现xml文件内部的主题。你必须问自己,这个文件的内容可能在哪个方面有所不同?以一种预期文件具有特定结构的方式设计系统并不是一种坏习惯。 (看看XSD文件)。试图设计一个动态发现xml并检查它是否与你的数据库兼容的系统似乎有点超出了你的范围。

您最好的猜测是编写一个自定义DOM / SAX解析器,它根据某些映射向您的数据库发出命令,您可以在一个可以调整运行时的文件中描述该映射。