jaxb2与xml之间相互转换

jaxb2与xml之间相互转换
分类: jaxb与xml转换 2011-12-16 22:51 69人阅读 评论(0) 收藏 举报
什么是JAXB?
URL url = (new URI("http://shz01d007:9025/adviser/100241/accounts")).toURL();
AccountTestList content = (AccountTestList) unMarshal.unmarshal(url);
System.out.println(content.toString());
@XmlRootElement(name = "accounts")
public class AccountTestList extends ArrayList<AccountTest> {

@XmlElementRef(type = AccountTest.class)
public List<AccountTest> getAccountTest() {
return this;
}
}
@XmlRootElement(name = "account")
public class AccountTest {


private String id;

private String acctName;

/**
* @return the id
*/
public String getId() {
return id;
}

/**
* @param id the id to set
*/
public void setId(String id) {
this.id = id;
}

/**
* @return the acctName
*/
public String getAcctName() {
return acctName;
}

/**
* @param acctName the acctName to set
*/
public void setAcctName(String acctName) {
this.acctName = acctName;
}
}
Java Architecture for XML Binding (JAXB)是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
这意味着你不需要处理甚至不需要知道XML编程技巧就能在Java应用程序中利用平台核心XML数据的灵活性。而且,可以充分利用XML的优势而不用依赖于复杂的XML处理模型如SAX或DOM。JAXB隐藏了细节并且取消了SAX和DOM中没用的关系——生成的JAXB类仅描述原始模型中定义的关系。其结果是结合了高度可移植Java代码和高度可移植的XML数据。其中这些代码可用来创建灵活、轻便的应用程序和Web服务。

JAXB2使用了JDK的新特性。如:Annotation、GenericType等,Jaxb2需要在即将转换的JavaBean中添加annotation注解。下面我们就来看看Jaxb2是怎么样完成Java对象到XML之间的相互转换的吧。

[java] view plaincopy
@XmlRootElement(name="bean")
public class Info implements Serializable {

private int id;
private String name;
private String email;
@XmlAttribute(name="num")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
[java] view plaincopy
@Test
public void testObject() {
Info info = new Info();
info.setId(1);
info.setName("allan");
info.setEmail("tom@tom.com");
try {
JAXBContext context = JAXBContext.newInstance(Info.class);
Marshaller marshal = context.createMarshaller();
StringWriter writer = new StringWriter();
marshal.marshal(info, writer);
System.out.println(writer);

Unmarshaller unMarshal = context.createUnmarshaller();
StringReader reader = new StringReader(writer.toString());
Info content = (Info) unMarshal.unmarshal(reader);
System.out.println("ID:" + content.getId() + "\n名字:"
+ content.getName() + "\nemail:" + content.getEmail());
} catch (JAXBException e) {
e.printStackTrace();
}
}

上面一段是JavaBean和XML的相互转换,传递了一个Info.class,这个Info不是一般的普通的bean。除了它带有getter、setter方法外,还有Annotation注解。

上面的XmlRootElement是设置当前对象转换成xml后的根节点,name的值是设置根节点的名称。在getter方法上设置XmlElement表示这个方法对应的属性是一个xml元素,如果这个注解还设置了name,那么这个name就是转换后xml的名称。在一个属性上设置XmlAttribute,表示这个方法对应的属性在转换xml后是父元素的一个属性。XmlAttribute的name就是转换后xml的属性的name。



[java] view plaincopy
@XmlRootElement(name="list-beans")
public class ListBean {

private List<Object> list;
private String name;

@XmlElements({
@XmlElement(name="bean",type=Info.class)
})
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
[java] view plaincopy
@Test
public void testList() {
List<Object> list = new ArrayList<Object>();
Info info = new Info();
info.setId(1);
info.setName("allan");
info.setEmail("tom@tom.com");
Info info2 = new Info();
info2.setId(2);
info2.setName("allan2");
info2.setEmail("tom2@tom.com");
list.add(info);
list.add(info2);
ListBean listBean = new ListBean();
listBean.setName("list to xml");
listBean.setList(list);
try {
JAXBContext context = JAXBContext.newInstance(ListBean.class);
Marshaller marshal = context.createMarshaller();
StringWriter writer = new StringWriter();
marshal.marshal(listBean, writer);
System.out.println(writer);

Unmarshaller unMarshal = context.createUnmarshaller();
StringReader reader = new StringReader(writer.toString());
ListBean content = (ListBean) unMarshal.unmarshal(reader);
System.out.println(content.getName());
} catch (JAXBException e) {
e.printStackTrace();
}
}

上面一段是List和XML的相互转换

XmlElements表示是一个集合类型,然后注解在集合中存放上面类型的对象。

XmlElement表示在集合中存放的一个对象类型和元素名称。



[java] view plaincopy
@XmlRootElement(name="map-beans")
public class MapBean {

Map<String,Info> map;

@XmlJavaTypeAdapter(MapAdapter.class)
public Map<String, Info> getMap() {
return map;
}

public void setMap(Map<String, Info> map) {
this.map = map;
}
}


[java] view plaincopy
public class MapElement {
/*@XmlElement
public String key;
@XmlElement
public Info value;
public MapElement() {
}
public MapElement(String key, Info value) {
super();
this.key = key;
this.value = value;
}*/
private String key;
private Info value;
private MapElement() {

}
public MapElement(String key, Info value) {
super();
this.key = key;
this.value = value;
}
@XmlElement
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
@XmlElement
public Info getValue() {
return value;
}
public void setValue(Info value) {
this.value = value;
}
}

[java] view plaincopy
public class MapAdapter extends XmlAdapter<MapElement[],Map<String,Info>>{
@Override
public Map<String, Info> unmarshal(MapElement[] param) throws Exception {
Map<String, Info> map=new HashMap<String, Info>();
for (MapElement element:param) {
//map.put(element.key, element.value);
map.put(element.getKey(), element.getValue());
}
return map;
}

@Override
public MapElement[] marshal(Map<String, Info> param) throws Exception {
MapElement[] element=new MapElement[param.size()];
int i=0;
for (Map.Entry<String, Info> entry: param.entrySet()) {
element[i++]=new MapElement(entry.getKey(),entry.getValue());
}
return element;
}
}


[java] view plaincopy
@Test
public void testMap() {
MapBean mapBean = new MapBean();
Info info = new Info();
info.setId(1);
info.setName("allan");
info.setEmail("tom@tom.com");
Info info2 = new Info();
info2.setId(2);
info2.setName("allan2");
info2.setEmail("tom2@tom.com");
Map<String, Info> map = new HashMap<String, Info>();
map.put("NO1", info);
map.put("NO2", info2);
mapBean.setMap(map);
try {
JAXBContext context = JAXBContext.newInstance(MapBean.class);
Marshaller marshal = context.createMarshaller();
StringWriter writer = new StringWriter();
//按照jaxb的格式输出
marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshal.marshal(mapBean, writer);
System.out.println(writer);

Unmarshaller unMarshal = context.createUnmarshaller();
StringReader reader = new StringReader(writer.toString());
MapBean content = (MapBean) unMarshal.unmarshal(reader);
System.out.println(content.getMap().size());
} catch (JAXBException e) {
e.printStackTrace();
}
}

上面的map集合的getter方法有一个XmlJavaTypeAdapter,需要传递一个Adapter的类型。

完整代码下载地址:http://download.csdn.net/detail/allan_chan/3931401
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值