您的位置:首页 > 其它

JAXB2简介及特性使用总结

2011-06-22 10:36 309 查看
一、简介

1、概念是什么:(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。是一种xml与object映射绑定技术标准,既然是标准就可以有不同实现.

2、JAXB中有什么:包含“xjc”工具和一个“schemagen”工具。

“xjc”工具可以用来将XML模式或其他类型模式文件(Java 1.6试验性地支持RELAX NG,DTD以及WSDL)转换为Java类。Java类使用javax.xml.bind.annotation包下的Java 标注,例如@XmlRootElement和@XmlElement。XML列表序列表示为java.util.List类型的属性, 通过JAXBContext可以创建Marshallers(将Java对象转换成XML)和Unmarshallers(将XML解析为Java对象)。 另外的“schemagen”工具,能够执行“xjc”的反向操作,通过一组标注的Java类创建一个XML模式。

二、JDK5以下开发需要的jar包:activation.jar、jaxb-api.jar、 jaxb-impl.jar、 jsr173-api.jar; 如果是基于JDK6以上版本已经集成JAXB2的JAR,在目录{JDK_HOME}/jre/lib/rt.jar中。

三、标注相关

注意:

1、注解可在属性定义上,也可在getter()方法上,最好在方法上注解,修饰属性用private,方法是public,属性注解可能会出现问题(如:JAXB “Class has two properties of the same name”)。

2、对象中的属性可以不全部映射到xml中,xml中出现的元素也不一定与映射的实体一一对应,映射的双方可以灵活对应

3、类上注解后,类中元素也默认按默认名称映射,但是对象属性名称与xml节点元素名称不一致时或者不需要显示在xml节点中时,则必须做对应的映射配置。

4、注解实例:映射一般分分:类名与xml根节点的映射、普通属性与xml节点的映射、集合与xml中包含子元素的节点的映射。

/**

*转换为xml的实体类

*/

import javax.xml.bind.annotation.XmlElement;

import javax.xml.bind.annotation.XmlRootElement;

//类注解,一个类最多可以有一个根元素

@XmlRootElement(name="Property")

public class Property {

private String sequence;

private Integer styleId;

private String elementName;

private String entityField;

//普通属性

@XmlElement

public String getSequence() {

return sequence;

}

public void setSequence(String sequence) {

this.sequence = sequence;

}

@XmlElement

public Integer getStyleId() {

return styleId;

}

public void setStyleId(Integer styleId) {

this.styleId = styleId;

}

@XmlElement

public String getElementName() {

return elementName;

}

public void setElementName(String elementName) {

this.elementName = elementName;

}

@XmlElement

public String getEntityField() {

return entityField;

}

public void setEntityField(String entityField) {

this.entityField = entityField;

}

}

/**

*包含上面对象实体的类

*/

import java.util.ArrayList;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;

import javax.xml.bind.annotation.XmlElements;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement

public class Resouce {

private String picLarge;

private List<Property> Properties;

@XmlElement

public String getPicLarge() {

return picLarge;

}

public void setPicLarge(String picLarge) {

this.picLarge = picLarge;

}

// 如果想在节点外面包一层xml元素节点,可以用

// @XmlElementWrapper(name="wrapper" )

@XmlElements( {

@XmlElement(name = "Property", type = Property.class),

// @XmlElement(name = "adInfo", type = AdInfo.class)一个集合可以放置多个xml元素名称和对象类型、在xml中是相互独立的集合元素,无包含关系

})

public List<Property> getProperties() {

return Properties;

}

public void setProperties(List<Property> properties) {

Properties = properties;

}

public static void main(String [] args){

Property property = new Property();

property.setElementName("elementName");

property.setEntityField("entityField");

property.setSequence("sequence");

property.setStyleId(11111);

Property property1 = new Property();

property1.setElementName("elementName111");

property1.setEntityField("entityField111");

property1.setSequence("sequence1111");

property1.setStyleId(22222);

List<Property> list = new ArrayList<Property>();

list.add(property);

list.add(property1);

Resouce resouce = new Resouce();

resouce.setPicLarge("picLarge");

resouce.setProperties(list);

JAXB2Tester.bean2Xml(resouce);

}

}

import java.io.ByteArrayInputStream;

import java.io.InputStream;

import java.io.StringWriter;

import java.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.List;

import javax.xml.bind.JAXBContext;

import javax.xml.bind.JAXBException;

import javax.xml.bind.Marshaller;

import javax.xml.bind.Unmarshaller;

/**

*xml与JAVA对象相互转化

*/

public class JAXB2Tester {

/**

* 将生成的xml转换为对象

* @param zClass 转换为实例的对象类类型

* @param xmlPath 需要转换的xml路径

*/

public static Object xml2Bean(Class<?> zClass, String xml) {

Object obj = null;

JAXBContext context = null;

if (null == xml || "".equals(xml) || "null".equalsIgnoreCase(xml)

|| xml.length() < 1)

return obj;

try {

context = JAXBContext.newInstance(zClass);

// if without "utf-8", Invalid byte 2 of 2-byte UTF-8 sequence.

InputStream iStream = new ByteArrayInputStream(xml.getBytes("utf-8"));

Unmarshaller um = context.createUnmarshaller();

obj = (Object) um.unmarshal(iStream);

return obj;

} catch (JAXBException e) {

e.printStackTrace();

}catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return obj;

}

public static String bean2Xml(Object bean) {

String xmlString = null;

JAXBContext context;

StringWriter writer;

if (null == bean)

return xmlString;

try {

//下面代码将对象转变为xml

context = JAXBContext.newInstance(bean.getClass());

Marshaller m = context.createMarshaller();

writer = new StringWriter();

m.marshal(bean, writer);

xmlString = writer.toString();

System.out.println(xmlString);

return xmlString;

} catch (Exception e) {

e.printStackTrace();

}

return xmlString;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: