栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JAXB @XmlAdapter用于任意XML

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAXB @XmlAdapter用于任意XML

TL; DR

只要您将值类型指定为(not

XmlAdapter
,就可以将域对象转换为的实例。
org.w3c.dom.Element``Object``Element


下面是一个完整的示例。

XmlAdapter

类型的字段/属性

java.lang.Object
会将未知内容保留为DOM节点。您可以在用例中通过在
XmlAdapter
as中指定值类型来利用它
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>


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496414.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号