java xmladapte_Java HTML/XML - 如何对任意XML使用JAXB @XmlAdapter

import java.io.File;

import javax.xml.bind.JAXBContext;

import javax.xml.bind.Marshaller;

import javax.xml.bind.Unmarshaller;

import javax.xml.bind.annotation.XmlAccessType;

import javax.xml.bind.annotation.XmlAccessorType;

import javax.xml.bind.annotation.XmlRootElement;

import javax.xml.bind.annotation.adapters.XmlAdapter;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

class BarAdapter extends XmlAdapter {

private DocumentBuilder documentBuilder;

public BarAdapter() {

try {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

documentBuilder = dbf.newDocumentBuilder();

} catch (Exception e) {

}

}

@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;

}

}

@XmlRootElement

@XmlAccessorType(XmlAccessType.FIELD)

class Foo {

@XmlJavaTypeAdapter(BarAdapter.class)

private Bar bar;

}

@XmlAccessorType(XmlAccessType.FIELD)

class Bar {

String value;

}

public class Main {

public static void main(String[] args) throws Exception {

JAXBContext jc = JAXBContext.newInstance(Foo.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();

File xml = new File("data.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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值