首页 > 编程语言 >JAXB 实现java对象与xml之间互相转换

JAXB 实现java对象与xml之间互相转换

时间:2022-11-25 23:33:33浏览次数:38  
标签:xml java name JAXB import public String

首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用:

1.@XmlRootElement,用于类级别的注解,对应xml的跟元素。通过name属性定义这个根节点的名称。

2.@XmlAccessorType,定义映射这个类中的何种类型都需要映射到xml。(如果不存在@XmlAccessorType,默认使用XmlAccessType.PUBLIC_MEMBER注解)

  参数:XmlAccessType.FIELD: java对象中的所有成员变量。

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

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

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

3.@XmlAttribute,用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。

4.@XmlElement,指定一个字段或get/set方法映射到xml的节点。通过name属性定义这个根节点的名称。

5.@XmlElementWrapper,为数组或集合定义一个父节点。通过name属性定义这个父节点的名称。

下面来看一个例子:

先定义一个学生类,Student如下:

package com.quest.software.bus4j.ui.framework.extend.frameParase.test;

import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;

public class Student {
    String name;  //姓名
    String sex;    //性别
    int number;     //学号
    String className;    //班级
    List<String> hobby;    //爱好

    public Student(){
    }
    public Student(String name,String sex,int number,
            String className,List<String> hobby) {
        this.name = name;
        this.sex = sex;
        this.number = number;
        this.className = className;
        this.hobby = hobby;
    }
    @XmlAttribute(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @XmlAttribute(name="sex")
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    @XmlAttribute(name="number")
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }

    @XmlElement(name="className")
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }

    @XmlElementWrapper(name="hobbys")
    @XmlElement(name = "hobby")
    public List<String> getHobby() {
        return hobby;
    }
    public void setHobby(List<String> hobby) {
        this.hobby = hobby;
    }

}

切记,如果java对象属性同时添加了get和set方法,注解不能定义在属性的定义上,只需在get或者set方法上定义一个即可,否则jaxb会报错!!如下:

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
  Class has two properties of the same name "name"

然后再定义学生集合类,StudentList如下:

package com.quest.software.bus4j.ui.framework.extend.frameParase.test;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="list")
public class StudentList {

    List<Student> students;    //所有学生信息的集合

    @XmlElement(name = "student")
    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

}

最后写xml和java对象互转的类(通过Marshaller类实现将对象转换为xml,同时也可利用Unmarshaller类进行xml转换为类):

1.java对象转换为xml:

package com.quest.software.bus4j.ui.framework.extend.frameParase.test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class BeanToXml {

    /**
     * java对象转换为xml文件
     * @param xmlPath  xml文件路径
     * @param load    java对象.Class
     * @return    xml文件的String
     * @throws JAXBException
     */
    public static String beanToXml(Object obj,Class<?> load) throws JAXBException{
        JAXBContext context = JAXBContext.newInstance(load);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
        StringWriter writer = new StringWriter();
        marshaller.marshal(obj,writer);
        return writer.toString();
    }
    public static void main(String[] args) throws JAXBException, IOException {
            List<String> hobby = new ArrayList<>();
            hobby.add("篮球");
            hobby.add("音乐");
            hobby.add("乒乓球");

            List<Student> studentList = new ArrayList<>();

            Student st = new Student("张三","男",10001,"尖子班",hobby);
            studentList.add(st);
            Student st1 = new Student("李四","男",10002,"普通班",hobby);
            studentList.add(st1);
            Student st2 = new Student("莉莉","女",10003,"普通班",hobby);
            studentList.add(st2);

            StudentList students = new StudentList();
            students.setStudents(studentList);
            String str =  BeanToXml.beanToXml(students, StudentList.class);

            //写入到xml文件中
            String xmlPath = "D:/testConfig.xml";
            BufferedWriter bfw = new BufferedWriter(new FileWriter(new File(xmlPath)));
            bfw.write(str);
            bfw.close();
    }
}

测试生成的xml文件如下图:

 

 

 

 2.xml转换为java对象

package com.quest.software.bus4j.ui.framework.extend.frameParase.test;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class XmlToBean {

    /**
     * xml文件配置转换为对象
     * @param xmlPath  xml文件路径
     * @param load    java对象.Class
     * @return    java对象
     * @throws JAXBException
     * @throws IOException
     */
    public static Object xmlToBean(String xmlPath,Class<?> load) throws JAXBException, IOException{
        JAXBContext context = JAXBContext.newInstance(load);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        Object object = unmarshaller.unmarshal(new File(xmlPath));
        return object;
    }

    public static void main(String[] args) throws IOException, JAXBException {
        String xmlPath =  "D:/testConfig.xml";
        Object object = XmlToBean.xmlToBean(xmlPath,StudentList.class);
        StudentList students = (StudentList)object;
        List<Student> studentList = students.getStudents();

        for(int i=0;i<studentList.size();i++){
            System.out.println(studentList.get(i).name);
            System.out.println(studentList.get(i).sex);
            System.out.println(studentList.get(i).number);
            System.out.println(studentList.get(i).className);
            for(String str :studentList.get(i).hobby){
                System.out.print(str+" ");
            }
            System.out.println("-------------");
        }
    }
}

测试打印的结果如下:

 

张三

10001
尖子班
篮球 音乐 乒乓球 -------------
李四

10002
普通班
篮球 音乐 乒乓球 -------------
莉莉

10003
普通班
篮球 音乐 乒乓球 -------------

jaxb虽然挺实用,但是在xml转java对象时xml文件不能配置错了,必须严格按照自己定义的java对象的注解来编写xml文件,否则jaxb里面报错很难查错!!!

 转自:http://t.zoukankan.com/ljl5921-p-13804258.html

标签:xml,java,name,JAXB,import,public,String
From: https://www.cnblogs.com/javalinux/p/16926666.html

相关文章

  • 利用java-springboot和paddleocr进行ocr识别
    利用java-springboot和paddleocr进行ocr识别项目:https://github.com/jiangnanboy/java-springboot-paddleocrTableofContentsAboutGettingStartedResultContactR......
  • Java基本数据类型
    Java基本数据类型1.整型byte占1字节空间,取值范围-2^7~(2^7)-1,二进制首位为符号位,二进制表示0_000_0000~1_111_1111,1_000_0000记为-128。/***Aconstant......
  • 记一次java四舍五入错误结果的问题
    1.背景在进行除法计算时,结果不符合预期2.测试过程double精度问题,导致四舍五入结果误差BigDecimalb1=newBigDecimal(0.245);BigDecimalb2=new......
  • JAVA数据类型拓展
    数据类型拓展,基础面试题讲解整数//整数拓展进制二进制0b十进制八进制0十六进制0xinti=10;inti2=0b10;inti3=010;......
  • ACM 模式下的Java
    一、引入包相关importjava.util.*;二、基本输入相关涉及到输入需要提前创建一个键盘接收器Scannercin=newScaner(System.in);1、输入一个基本数据结构按照by......
  • Java SPI 机制浅析
    本文通过探析JDK提供的,在开源项目中比较常用的JavaSPI机制,希望给大家在实际开发实践、学习开源项目提供参考。一、SPI是什么SPI全称ServiceProviderInterface,......
  • Java 数组拷贝的几种方式
    目前在Java中数据拷贝提供了如下方式:1、clone2、System.arraycopy3、Arrays.copyOf4、Arrays.copyOfRange。一、clone方法clone方法是从Object类继承过来的,基本数据......
  • Java 序列化工具
    一、Java自带的序列化Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据......
  • Java学习六
    一.小结1.使用语法elemenrType[] arrayRefVar(元素类型[]数组引用变量)或elementType  arrayRefVar[](元素类型数组引用变量[])声明一个数组类型的变量。尽管e......
  • JavaScript中String的match方法详解
      String.prototype.match()**String.prototype.match()方法返回通过一个正则表达式匹配到的字符串结果。**varparagraph='Thequickbrownfoxjumpsove......