TL; DR
只要您将值类型指定为(not
)
XmlAdapter,就可以将域对象转换为的实例。
org.w3c.dom.Element``Object``Element
下面是一个完整的示例。
XmlAdapter
类型的字段/属性
java.lang.Object会将未知内容保留为DOM节点。您可以在用例中通过在
XmlAdapteras中指定值类型来利用它
Object。您将需要确保从
marshal方法返回的根元素与
@XmlElement注释定义的字段/属性匹配。
import javax.xml.bind.annotation.adapters.XmlAdapter;import javax.xml.parsers.*;import org.w3c.dom.*;public class BarAdapter extends XmlAdapter<Object, Bar>{ private documentBuilder documentBuilder; public BarAdapter() { try { documentBuilderFactory dbf = documentBuilderFactory.newInstance(); documentBuilder = dbf.newdocumentBuilder(); } catch(Exception e) { // TODO - Handle Exception } } @Override public Bar unmarshal(Object v) throws Exception { Bar bar = new Bar(); Element element = (Element) v; bar.value = element.getTextContent(); return bar; } @Override public Object marshal(Bar v) throws Exception { document document = documentBuilder.newdocument(); Element root = document.createElement("bar"); root.setTextContent(v.value); return root; }}Java模型
oo
该
@XmlJavaTypeAdapter注释被用于引用
XmlAdapter。
import javax.xml.bind.annotation.*;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)public class Foo { @XmlJavaTypeAdapter(BarAdapter.class) private Bar bar;}酒吧
import javax.xml.bind.annotation.*;@XmlAccessorType(XmlAccessType.FIELD)public class Bar { String value;}示范代码
演示版
由于创建documentBuilderFactory会产生成本,因此我们可以通过在Marshaller上设置实例来利用JAXB处理XmlAdapter的有状态实例的功能。
import java.io.File;import javax.xml.bind.*;public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Foo.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); File xml = new File("src/forum18272059/input.xml"); Foo foo = (Foo) unmarshaller.unmarshal(xml); Marshaller marshaller = jc.createMarshaller(); marshaller.setAdapter(new BarAdapter()); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(foo, System.out); }}input.xml /输出
<?xml version="1.0" encoding="UTF-8"?><foo> <bar>Hello World</bar></foo>



