JAXB使用xi:include导出到模块化xml文件
我有两个XML文件 tree.xmlJAXB使用xi:include导出到模块化xml文件,xml,jaxb,include,modular,Xml,Jaxb,Include,Modular,我有两个XML文件 tree.xml <tree> <xi:include href="fruit.xml" xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:fallback> <fruit/> </xi:fallback> </xi:include> </tree> fruit.xml
<tree>
<xi:include href="fruit.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:fallback>
<fruit/>
</xi:fallback>
</xi:include>
</tree>
fruit.xml
<fruit>
...
</fruit>
...
我继承了代码来解组文件,它返回一个java对象。现在,我需要将单个java对象整理回两个文件。我意识到还有其他解决方案(即使用两个对象而不是一个对象,这是一个选项),但我需要知道是否有可能对单个对象进行马歇尔处理并维护xi:include(或重新引入)并导出到两个(或多个)xml文件
这可能吗?如果有的话,有什么建议/想法吗
谢谢
更新:
我一直在研究这个(我在问之前就研究过)。我确实找到了这个教程,它似乎有我的答案,但当我整理文件时,它取了两个,得到了一个 我找到了答案,至少找到了解决办法。我想这可能是做这件事的方法 我希望JAXB有某种方法来定义对象的一部分作为封送处理的包含,但我从来没有找到任何东西 注意:我有一个额外的黑客,我将在下面解释,我想你可以不用它,但我无法让它工作,在其他人需要这样做的情况下,至少他们会知道 流程如下
Travis下面我将演示如何使用
XmlAdapter
来支持此用例的编组和解编组
XmlAdapter(IncludeFruitAdapter)
此用例可以使用XmlAdapter
导入java.io.File;
导入javax.xml.bind.*;
导入javax.xml.bind.annotation.*;
导入javax.xml.bind.annotation.adapters.XmlAdapter;
公共类includefruitapter扩展了XmlAdapter{
私有jaxbcontextjc;
私有字符串href=“fruit.xml”;
公共IncludeFruitAdapter(){
试一试{
jc=JAXBContext.newInstance(Fruit.class);
}捕获(例外e){
抛出新的运行时异常(e);
}
}
公共静态类包括{
@XmlAttribute
公共字符串href;
@XmlElement(命名空间=”http://www.w3.org/2001/XInclude")
公众退避;
}
公共静态类回退{
@xmlementref
公众水果价值;
}
@凌驾
公众包括元帅(水果)抛出异常{
文件xml=新文件(href);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.marshall(水果,xml);
Include=新的Include();
include.href=href;
include.fallback=新的回退();
include.fallback.value=新水果();
回报包括;
}
@凌驾
公共水果解组(包括)抛出异常{
文件xml=新文件(include.href);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
试一试{
return(Fruit)unmarshaller.unmarshal(xml);
}捕获(例外e){
返回include.fallback.value;
}
}
}
树
@XmlJavaTypeAdapter
用于引用XmlAdapter
import javax.xml.bind.annotation.*;
导入javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
公共类树{
@XmlJavaTypeAdapter(IncludeFruitAdapter.class)
@XmlElement(name=“include”,名称空间=”http://www.w3.org/2001/XInclude")
私家水果;
}
水果
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
公共级水果{
私有字符串名称;
}
演示
下面是一些演示代码,您可以运行这些代码来证明一切正常:
导入java.io.File;
导入javax.xml.bind.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(Tree.class);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
File xml=新文件(“input.xml”);
Tree-Tree=(Tree)unmarshaller.unmarshal(xml);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.marshall(树、系统、输出);
}
}