JAXB2简介及特性使用总结
一、简介
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;
}
}