JAXB将XML片段映射为另一个XML文档中的片段

时间:2013-12-09 21:29:07

标签: java xml jaxb marshalling unmarshalling

使用JAXB,是否有一种首选(或最佳)方法从文档中获取XML片段,然后将该片段包含在另一个文档中?从一个模式映射到另一个模式。有没有人提到这种方法?我试图找到一些方法来做到这一点,但大多数搜索结果导致只是编组和解组。

我有多个XML源文档,其中包含我想要包含在辅助目标XML文档中的XML片段。目标片段看起来与源片段完全相同。 source和destingation XML文档的名称空间不同,主要是因为相同标签的模式略有不同,但是片段定义相同,只是它在父名称空间中(生成JAXB对象,我希望包的分离)每个命名空间的Java对象,因为不同数据的元素名称相同,并且在尝试使用片段的公共模式时遇到了一些问题。

对于MyDoc的给定源XML(见下文),我有一个subdoc XML片段,我希望将其包含在DestDoc目标XML的subdoc列表中。 Attrib_1在目标文档中的名称相同,但内容类型不同。我正在尝试从MyDoc获取subdoc并包含在DestDoc中的subdoc列表中,如下所示。由于subdoc是相同的XML,我只需要从mydoc / subdoc转换为destdoc / subdocs / subdoc。

由于我从XML开始,我可以解组到MyDoc对象并获取subdoc对象。此时,我可以将其编组为XML片段,尝试将其插入到正确位置的目标XML父元素中,然后取消编组作为目标对象以添加其他内容或使用子目录映射器在mydoc /之间进行转换subdoc对象和destdoc / subdoc对象,但我会有一个依赖于两个模式的对象。如果任一架构发生变化,那么它就是一个维护点。最后,在DestDoc的所有创建方面之后,我将整理XML以输入另一个进程。

我发现如果名称MyDoc和DestDoc没有意义的常见示例,将Bookstore设想为DestDoc,将subdoc设想为books,将subdoc设置为book,将MyDoc设置为BookInfo。 Attrib_1可能是book_id,其源和目标值不同,而attrib_6可能是subdocs的汇总计数。

源XML:

<MyDoc xmlns="http://www.test.com/xsd/mydoc">
  <attrib_1>987</attrib_1>
  <attrib_2>bcd</attrib_2>
  <subdoc>
    <attrib_3>a1</attrib_3>
    <attrib_4>b1</attrib_4>
  </subdoc>
</MyDoc>

目标XML:

<DestDoc xmlns="http://www.test.com/xsd/destdoc">
  <attrib_1>abc</attrib_1>
  <attrib_5>123</attrib_5>
  <attrib_6>456</attrib_6>
  <subdocs>
    <subdoc>
      <attrib_3>a1</attrib_3>
      <attrib_4>b1</attrib_4>
    </subdoc>
  </subdocs>
</DestDoc>

2 个答案:

答案 0 :(得分:2)

尝试编组到DOM:

   DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
   dbf.setNamespaceAware(true);
   DocumentBuilder db = dbf.newDocumentBuilder();
   Document doc = db.newDocument();

   m.marshal(jaxbElement, doc);

然后使用旧式的采用节点。

答案 1 :(得分:0)

根据您对Daniel Kec的回答的评论中指定的其他要求,您可能最好使用这种方法:

  1. 将旧数据解组为特定的对象实例 type(在旧架构中定义。)
  2. 在新架构下创建您正在创建的新类型的空对象实例。
  3. 使用您希望从旧数据对象获得的任何相应字段以及您喜欢的任何新数据填充新对象的字段。
  4. 使用新架构定义的验证程序清空新数据。
  5. 作为替代方案,您可以定义一个实现新模式指定的接口的类,该类封装了特定方法实现委派给的旧类型的实例。然后(大概)将旧类型对象(在它被解组之后)作为相关类的构造函数的参数传递。然后,您可以编组新类的实例。