当前位置:   article > 正文

JAXB实现JavaBean和xml互相转换_jaxbe

jaxbe

一、简介

        JAXB(Java API for XML Binding)是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。

        Jaxb 2.0是JDK 1.6的组成部分。我们不需要下载第三方jar包即可做到轻松转换。Jaxb2使用了JDK的新特性,如:Annotation、GenericType等,需要在即将转换的JavaBean中添加annotation注解。

二、用法

        1、JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。

        2、Marshaller接口,将Java对象转化为XML数据。

        3、Unmarshaller接口,将XML数据转化为Java对象。

        注解:

        1>@XmlRootElement,用于类上的注解,将一个Java类及其成员变量映射为XML的根节点以及子节点。其中:属性name定义根节点的名称,namespace定义这个根节点命名空间。常与@XmlType和@XmlAccessorType一起使用。

        2>@XmlType,用在类上的注解。其中:属性name指定XML Schema中type的名称,namespace指定Schema中的命名空间,factoryClass指定unMarshal时生成映射类实例所需的工厂类,默认为这个类本身,factoryMethod指定工厂类的工厂方法,propOrder指定序列化的顺序:

                ①所有转为XML元素的属性都必须出现在@XmlType的propOrder列表中;

                ②所有@XmlElementWrapper标注的属性都不能出现在@XmlType的propOrder列表中。

        3>@XmlAccessorType,用于类上的注解,用于指定对象的哪些成员变量会生成xml。常与@XmlRootElement、@XmlType一起使用。其中属性XmlAccessType的4个枚举值,分别为:

                ①XmlAccessType.FIELD:对象中的所有成员变量

                ②XmlAccessType.PROPERTY:对象中所有通过getter/setter方式访问的成员变量

                ③XmlAccessType.PUBLIC_MEMBER:对象中所有有public访问权限的成员变量和通过getter/setter方式访问的成员变量

                ④XmlAccessType.NONE:对象的所有属性都不映射为xml的元素

            注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,因此,如果对象中的private成员变量设置了getter/setter方法,就不要在private变量上使用@XmlElement和@XmlAttribute注解,否则在由对象生成xml时会报该属性在java类里存在两次的错误。同理,如果@XmlAccessorType的访问权限为XmlAccessType.NONE,如果在成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。   

        4>@XmlAccessorOrder,用于类上的注解,对元素进行排序。它有两个值:

                ①XmlAccessOrder.ALPHABETICAL:按字母书序排序

                ②XmlAccessOrder.UNDEFINED:不排序

        5>@XmlElement,用于成员变量或getter/setter方法上,将对应的变量映射到同名的一个XML节点。其中:属性name指定节点名称,namespace指定节点命名空间,required指定节点是否必输,nillable指定节点是否是nillable,type指定节点关联的类型。

        6>@XmlElementWrapper ,用于成员变量或getter/setter方法上,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素。其中:属性name指定集合名称,namespace指定集合命名空间,required指定集合是否必输nillable指定集合是否是nillable。

        7>@XmlAttribute,用于成员变量或getter/setter方法上,将对应的变量映射到同名的一个XML节点属性。其中:属性name指定属性名称,namespace指定属性命名空间,required指定属性是否必输。

        8>@XmlTransient,用于标示在由java对象映射xml时,忽略此属性。即在生成的xml文件中不出现此元素。

        9>@XmlSchema,配置整个包的namespace,这个注解需放在package-info.java文件中。      

        10>@XmlJavaTypeAdapter以及@XmlJavaTypeAdapters用于包、类、成员变量或getter/setter方法上,常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。使用格式是:@XmlJavaTypeAdapter(value=xxx.class),xxx为自己定义的adapter类。  

三、示例

        1、对象转为xml

People.java

  1. @XmlRootElement(name="employee")
  2. @XmlAccessorType(XmlAccessType.FIELD)
  3. @XmlType(name="emp",namespace="aa",propOrder={"id","name","sex","age"})
  4. public class People{
  5. public String id="001";
  6. public String name="张三";
  7. public String sex="男";
  8. private String age="30";
  9. }
Test.java

  1. public class Test {
  2. public static void main(String args[]){
  3. People p = new People();
  4. convertToXml(p,"utf-8");
  5. }
  6. public static String convertToXml(Object obj, String encoding){
  7. String result = null;
  8. try {
  9. JAXBContext context = JAXBContext.newInstance(obj.getClass());
  10. Marshaller marshaller = context.createMarshaller();
  11. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  12. marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
  13. marshaller.setProperty(Marshaller.JAXB_FRAGMENT,false);
  14. StringWriter writer = new StringWriter();
  15. marshaller.marshal(obj, writer);
  16. result = writer.toString();
  17. System.out.println(result);
  18. } catch (Exception e) {
  19. e.printStackTrace();
  20. }
  21. return result;
  22. }
  23. }

       2、xml转为对象

People.java

  1. @XmlRootElement(name="employee")
  2. public class People{
  3. public String id;
  4. public String name;
  5. public String sex;
  6. public String age;
  7. public String toString(){
  8. return this.id+","+this.name+","+this.sex+","+this.age;
  9. }
  10. }
Test.java
  1. public class Test {
  2. public static void main(String args[]){
  3. People p = new People();
  4. String xml="<?xml version='1.0' encoding='utf-8' standalone='yes'?>" +
  5. "<employee>"+
  6. "<id>002</id>"+
  7. "<name>李四</name>"+
  8. "<sex>女</sex>"+
  9. "<age>28</age>"+
  10. "</employee>";
  11. convertToObject(p, xml);
  12. }
  13. public static String convertToObject(People p, String xml){
  14. String result = null;
  15. try {
  16. StringReader sr = new StringReader(xml);
  17. JAXBContext context = JAXBContext.newInstance(p.getClass());
  18. Unmarshaller unmarshaller = context.createUnmarshaller();
  19. p=(People)unmarshaller.unmarshal(sr);
  20. result=p.toString();
  21. System.out.println(result);
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. return result;
  26. }
  27. }




参考:http://blog.csdn.net/lw371496536/article/details/6942045

            http://www.cnblogs.com/qiyebao/p/4573665.html


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/421654
推荐阅读
相关标签
  

闽ICP备14008679号