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



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

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

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

由于我是从XML开始的,所以我可以将其解组为MyDoc对象并获取子域对象。在这一点上,我可以将其整理成一个XML片段,尝试将其插入到正确位置的目标XML父元素中,然后将其解组为目标对象以添加额外的内容,或者使用子域映射器在mydoc/sudoc-object和destdoc/sudoc/object之间进行转换,但我会有一个依赖于这两个模式的对象。如果任何一个模式发生了更改,那么它就是一个维护点。最终,在完成了DestDoc的所有创建方面之后,我将整理成XML,以便输入到另一个流程。

我发现的一个常见的例子是,如果MyDoc和DestDoc的名称没有意义,可以将Bookstore想象成DestDoc,将子域想象成books,将子域设想成book,将MyDoc想象成BookInfo。属性_1可能是book_id,源和目的地的值不同,而属性_6可能是子域的摘要计数。

源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>

尝试封送至DOM:

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

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

由于您在对Daniel Kec的回答的评论中指定了额外的要求,您可能最好使用这种方法:

  1. 将旧数据解组为其特定的对象实例类型(如旧架构中定义的。)
  2. 为您在新架构下创建的新类型创建一个空对象实例
  3. 使用旧数据对象中所需的任何相应字段以及您喜欢的任何新数据填充新对象的字段
  4. 使用新模式定义的验证器封送新数据

作为替代方案,您可以定义一个类,该类实现由新模式指定的接口,并封装特定方法实现所委托的旧类型的实例。然后(大概)将旧类型对象(在它被解组之后)作为参数传递给有问题的类的构造函数。然后可以封送出新类的实例。

最新更新