首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

JAXB2简介及特征使用总结

2012-08-01 
JAXB2简介及特性使用总结一、简介1、概念是什么:(Java Architecture for XML Binding) 是一个业界的标准,是

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

}

热点排行