Jaxb技术进行xml和javabean对象之间互相转化

  • 格式:pdf
  • 大小:98.91 KB
  • 文档页数:4
@XmlElement注解用于标注 Javabean 的属性,用它标注的属性在映射后的 schema 中以元素的形式出现,所有 Javabean 属性映射 的元素组合成为 @XmlType 映射的复杂数据类型。我们可以通过 @XmlElement 注解的 name 属性定制映射后的 XML 元素的名称,用 required 属性来指定该元素是否必须出现,用 nillable 属性来指明该元素是否允许空值。如:
5.@XmlAccessorType
@XmlAccessorType用于指定由java对象生成xml文件时对java对象属性的访问方式。常与@XmlRootElement、@XmlType一起使用。它的 属性值是XmlAccessType的4个枚举值,分 别为:
XmlAccessType.FIELD:java对象中的所有成员变量
private SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); @Override public Date unmarshal(String v) throws Exception {
3.@XmlRootElement
@XmlRootElement用于类级别的注解,对应xml的跟元素,有name属性,name的值可以指定根节点的tag,常与 @XmlType 和
@XmlAccessorType一起使用。如:
@XmlType @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name="addressDetail") public class Address {}
}
9.@XmlElementWrapper
@XmlElementWrapper常用在类的成员变量为List上,可以设置为List节点的标签,name的值是List标签的tag
@XmlElementWrapper(name = "provinces") @XmlElement(name = "province") private List<Province> provinceList;
return t; }
三、使用注解
在Jaxb中常用的注解有:
1. @XmlType 2. @XmlElement 3. @XmlRootElement 4. @XmlAttribute 5. @XmlAccessorType 6. @XmlAccessorOrder 7. @XmlTransient 8. @XmlJavaTypeAdapter 9. @XmlElementWrapper 10. @XmlList 11. @XmlSchema 12. @XmlValue 13. @XmlJavaTypeAdapter
6.@XmlAccessorOrder
@XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:
AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序
XmlAccessOrder.UNDEFINED:不排序
7.@XmlTransient
4.@XmlAttribute
@XmlAttribute用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名,用 required 属性来指定是否映
射后的属性为必须出现的。如: @XmlType(name = "CustomizedStudent", propOrder={"name","id","age"}) public class Student {
如:
@XmlType(name = "basicStruct", propOrder = { "intValue", "stringArray", "stringValue"
)
在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。
2.@XmlElement
1. @XmlType
@XmlType 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中中会以一个 XML 复杂数据类型的形式出现。我们可以通过 @XmlType 注解的 name 属性来定制映射的 XML 数据类型的名称,用 propOrder 属性来定制映射后的复杂数据类型的内容顺序等,常与 @XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。
@XmlElement(name="StudentID") private int id; @XmlAttribute(name="StudentAge") private int age; @XmlAttribute(name="StudentName",required=true) private String name; }
@XmlTransient用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。
8.@XmlJavaTypeAdapter
@XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继
10.@XmlList
@XmlList常用在类成员属性类型为list上,是该list的值显示在一行,以空格隔开,可以和@XmlAttribute 一起使用
@XmlList private List<String> addr;
11.@XmlSchema
配置整个包的namespace,这个注解需放在package-info.java文件中
注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,因此,如果java对象中的private成员变量设置了public 权限的getter/setter方法,就不要在 private变量上使用@XmlElement和@XmlAttribute注解,否则在由java对象生成xml时会报同 一个属性在java类里存在两次的错误。同理,如果@XmlAccessorType的访问权限 为XmlAccessType.NONE,如果在java的成员变量上 使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。
承XmlAdapter抽象类,并实现里面的方法。
@XmlJavaTypeAdapter(value=xxx.class),value为自己定义的adapter类
XmlAdapter如下:
public abstract class XmlAdapter<ValueType,BoundType> { // Do-nothing constructor for the derived classes. protected XmlAdapter() {} // Convert a value type to a bound type. public abstract BoundType unmarshal(ValueType v); // Convert a bound type to a value type. public abstract ValueType marshal(BoundType v);
12.@XmΒιβλιοθήκη Value使用在类的成员变量上,被注解的成员变量的值将作为类的值输出,可以和@XmlList一起使用
@XmlList @XmlValue private List<String> addr;
13.@XmlJavaTypeAdapter
使用在类属性上,用于自定义日期格式
@XmlJavaTypeAdapter(DateAdapter.class) private Date date;
return result; }
二、xmlToBean
public static <T> T converyToJavaBean(String xml, Class<T> c) { T t = null; try { JAXBContext context = JAXBContext.newInstance(c); Unmarshaller unmarshaller = context.createUnmarshaller(); t = (T) unmarshaller.unmarshal(new StringReader(xml)); } catch (Exception e) { e.printStackTrace(); }
XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量
XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量
XmlAccessType.NONE:java对象的所有属性都不映射为xml的元素
@XmlType(name = "CustomizedStudent", propOrder = { "name", "id", "age"}) public class Student {
@XmlElement(name="StudentID",required=true) private int id; @XmlElement(name="StudentAge",nillable=true) private int age; @XmlElement(name="StudentName") private String name; }