使用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>
答案 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的回答的评论中指定的其他要求,您可能最好使用这种方法:
作为替代方案,您可以定义一个实现新模式指定的接口的类,该类封装了特定方法实现委派给的旧类型的实例。然后(大概)将旧类型对象(在它被解组之后)作为相关类的构造函数的参数传递。然后,您可以编组新类的实例。