【java系列】使用JAXB实现java对象和XML的转换

JAXB

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。

核心类

JAXBContext:

  • Jaxb的上下文,通过这个对象我们能拿到另外两个核心对象Unmarshaller(用于解析xml)和Marshaller (生成xml)JAXBContext通常使用它的静态方法newInstance(Class className)来获得对象

Unmarshaller

  • 用于解析xml 通过JAXBContext的createUnmarshaller方法获得到

Marshaller

  • 用于生成xml 通过JAXBContext的createMarshaller方法获得到

核心注解

@XmlRootElement :

xml 文件的根元素

@XmlAccessorType:

包和类级别的注解。javaEE的API对该注解的解释是:控制字段是否被默认序列化。

  • PROPERTY:自动绑定getter/setter方法的属性。
  • FIELD:自动绑定非静态、非瞬态字段。
  • PUBLIC_MEMBER(默认):相当于PROPERTY+FIELD。
  • NONE:都不绑定。

注意:

JAXB绑定xml有三种方式:
1.字段绑定(需要public修饰)。
2.getter/setter的属性绑定(需要public修饰)。
3.被@XmlElement注解修饰的字段或者getter/setter方法(四种修饰符都可以)。

注意:方式3中优先绑定为@XmlElement的name属性,其次按照字段名或者getter/setter的属性名,且同一个属性的getter/setter只需要绑定一次。

如果说非要同时使用getter/setter和@XmlElement、字段和@XmlElement,又不想出现上面提示绑定两次的报错,这个时候就需要使用@XmlAccessorType,指定value为PROPERTY或者FIELD或者NONE。

@XmlElement:
  • @XmlElement将java对象的属性映射为xml的节点,在使用@XmlElement时,可通过name属性改变java对象属性在xml中显示的名称。
@XmlAttribute:
  • @XmlAttribute將被序列化为xml节点中的属性

@XmlAttribute和@XmlElement的区别,就是一个为节点属性,一个为节点
image.png

@XmlTransient

类,字段,方法级别的注解。可使JAXB在映射xml元素时忽略被注解的类,字段,get/set对应字段。需要注意的是该注解与所有其他JAXB注释相互排斥,也就是说与其他注释连用就会报错。

java对象转xml

下面为使用案例

1、引入依赖

引入lombom和fastjson,方便转换

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.22</version>
        </dependency>

   <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
2、定义实体类
package xml;

import lombok.Data;

import javax.xml.bind.annotation.*;
//1、根节点
@XmlRootElement(name = "Person")
//控制是否序列化
@XmlAccessorType(XmlAccessType.FIELD)
// lombok中自动生成getter和setter方法
@Data
public class Person {

//生成节点
    @XmlElement(name = "NAME")
    private String name;
//节点属性
    @XmlAttribute(name = "SEX")
    private String sex;

    @XmlElement(name = "AGE")
    private Integer age;

    //子节点,是一个类
    @XmlElement
    private FamilyInfo familyInfo;

}

package xml;

import lombok.Data;

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

@Data
//这里注意需要加上去,否则如果是默认的话,会产生错误
//
@XmlAccessorType(XmlAccessType.FIELD)
public class FamilyInfo {

    @XmlElement(name = "Father")
    private String father;
    @XmlElement(name = "Mother")
    private String mother;
}

3、测试方法
package xml;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

public class JAXBTest {

    public static void main(String[] args) throws JAXBException {
        //java对象转xml
        testBeanToXml();

    }

//测试方法
    public static void testBeanToXml() throws JAXBException {
        Person person = new Person();
        person.setName("walker");
        person.setAge(18);
        person.setSex("男");

        FamilyInfo familyInfo = new FamilyInfo();
        familyInfo.setFather("walker_father");
        familyInfo.setMother("walker_mother");
        person.setFamilyInfo(familyInfo);

        JAXBContext context=null;
        StringWriter writer=null;

        //1、创建上下文
        context = JAXBContext.newInstance(Person.class);
        //2、创建Marshaller 这个是用于转换成xml的
        Marshaller marshaller = context.createMarshaller();
        //3、设置marshaller的属性
        //JAXB_FORMATTED_OUTPUT:格式化
        //JAXB_ENCODING:编码格式
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING,"utf8");
        //4、实例化StringWriter
        writer=new StringWriter();
        //5、将实体类读取到writer中
        marshaller.marshal(person,writer);
        //6、输出结果
        System.out.println(writer.toString());
    }
}

Marshaller的相关属性

JAXB_ENCODING:编码
JAXB_FORMATTED_OUTPUT

  • jaxb.formatted.output:值必须是 java.lang.Boolean
    此属性控制 Marshaller 是否使用换行和缩排对得到的 XML 数据进行格式化。此属性为 true 值表示可读性强的缩排 xml 数据,而属性值为 false 则表示未格式化的 xml 数据。如果未指定此属性,则 Marshaller 将该属性值默认为 false (未格式化)。

JAXB_SCHEMA_LOCATION:

JAXB_NO_NAMESPACE_SCHEMA_LOCATION:

JAXB_FRAGMENT:

public static final String JAXB_ENCODING =
        "jaxb.encoding";

    /**
     * The name of the property used to specify whether or not the marshalled
     * XML data is formatted with linefeeds and indentation.
     */
    public static final String JAXB_FORMATTED_OUTPUT =
        "jaxb.formatted.output";

    /**
     * The name of the property used to specify the xsi:schemaLocation
     * attribute value to place in the marshalled XML output.
     */
    public static final String JAXB_SCHEMA_LOCATION =
        "jaxb.schemaLocation";

    /**
     * The name of the property used to specify the
     * xsi:noNamespaceSchemaLocation attribute value to place in the marshalled
     * XML output.
     */
    public static final String JAXB_NO_NAMESPACE_SCHEMA_LOCATION =
        "jaxb.noNamespaceSchemaLocation";

    /**
     * The name of the property used to specify whether or not the marshaller
     * will generate document level events (ie calling startDocument or endDocument).
     */
    public static final String JAXB_FRAGMENT =
        "jaxb.fragment";
4、返回结果
<?xml version="1.0" encoding="utf8" standalone="yes"?>
<Person SEX="">
    <NAME>walker</NAME>
    <AGE>18</AGE>
    <familyInfo>
        <Father>walker_father</Father>
        <Mother>walker_mother</Mother>
    </familyInfo>
</Person>

可以发现使用@XmlAttribute生成的是属性,@XmlElement生成的是子节点

xml转bean

第1、2步和java对象转xml一样
3、测试方法
package xml;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

public class JAXBTest {

    public static void main(String[] args) throws JAXBException {
        /**
        * xml字符串转java对象
        */
        xmlStrToBean();

    }


    public static void xmlStrToBean() throws JAXBException {
        String xmlStr="<?xml version=\"1.0\" encoding=\"utf8\" standalone=\"yes\"?>\n" +
                "<Person SEX=\"男\">\n" +
                "    <NAME>walker</NAME>\n" +
                "    <AGE>18</AGE>\n" +
                "    <familyInfo>\n" +
                "        <Father>walker_father</Father>\n" +
                "        <Mother>walker_mother</Mother>\n" +
                "    </familyInfo>\n" +
                "</Person>";

        JAXBContext context=null;
        StringReader reader=null;
        //1、创建context
        context=JAXBContext.newInstance(Person.class);
        //2、创建Unmarshaller
        Unmarshaller unmarshaller = context.createUnmarshaller();
        //3、实例化reader,将xml字符串放入参数
        reader=new StringReader(xmlStr);
        //4、使用unmarshaller.unmarshal 参数放入read
        Object res = unmarshaller.unmarshal(reader);
        //5、输出结果
        System.out.println(res);

    }

}

4、输出结果
Person(name=walker, sex=男, age=18, familyInfo=FamilyInfo(father=walker_father, mother=walker_mother))

整合工具类

package xml;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

public class JAXBUtils {

    public static <T> T xmlStrToBean(String xmlStr,Class<T> clsLoader) throws JAXBException {

        JAXBContext context=null;
        StringReader reader=null;
        T res = null;
        try {
            //1、创建context
            context=JAXBContext.newInstance(clsLoader);
            //2、创建Unmarshaller
            Unmarshaller unmarshaller = context.createUnmarshaller();
            //3、实例化reader,将xml字符串放入参数
            reader=new StringReader(xmlStr);
            //4、使用unmarshaller.unmarshal 参数放入read
            res = (T) unmarshaller.unmarshal(reader);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        System.out.println(res);
        //5、输出结果
        return res;

    }

    public static <T> String beanToXml(T t,String encoding) throws JAXBException {
        JAXBContext context=null;
        StringWriter writer=null;

        //1、创建上下文
        context = JAXBContext.newInstance(t.getClass());
        //2、创建Marshaller 这个是用于转换成xml的
        Marshaller marshaller = context.createMarshaller();
        //3、设置marshaller的属性
        //JAXB_FORMATTED_OUTPUT:格式化
        //JAXB_ENCODING:编码格式
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING,encoding);
        //4、实例化StringWriter
        writer=new StringWriter();
        //5、将实体类读取到writer中
        marshaller.marshal(t,writer);
        System.out.println(writer.toString());
        //6、输出结果
        return writer.toString();
    }
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 使用 JAXB 生成 Java 实体类需要按照以下步骤进行: 1. 在 pom.xml 中添加 JAXB 的依赖。 ``` <dependencies> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> </dependencies> ``` 2. 创建一个包含 JAXB 注解的 Java 类。 ``` import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Person { private String name; private int age; // 省略 getter 和 setter 方法 } ``` 3. 使用 JAXBXML 数据映射到 Java 实体类。 ``` import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; // 读取 XML 文件 File file = new File("person.xml"); // 创建 JAXBContext 对象 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); // 创建 Unmarshaller 对象 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // 将 XML 数据转换Java 对象 Person person = (Person) unmarshaller.unmarshal(file); // 输出结果 System.out.println(person.getName()); System.out.println(person.getAge()); ``` 4. 使用 JAXBJava 实体类转换XML 数据。 ``` import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; // 创建 Person 对象 Person person = new Person(); person.setName("张三"); person.setAge(20); // 创建 JAXBContext 对象 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); // 创建 Marshaller 对象 Marshaller marshaller = jaxbContext.createMarshaller(); // 将 Java 对象转换XML 数据 marshaller.marshal(person, new File("person.xml ### 回答2: Java中,JAXBJava Architecture for XML Binding)是一种用于将XML数据与Java对象进行绑定的技术。JAXB可以根据给定的XML数据自动生成Java实体类的内容。 在使用JAXB时,我们需要先编写一个XSD(XML Schema Definition)文件,XSD文件定义了XML数据的结构和规则。然后,我们可以使用JAXB提供的工具将XSD文件转换Java类。 首先,我们需要导入JAXB相关的包,例如javax.xml.bind.annotation和javax.xml.bind.annotation.adapters等。 然后,我们可以使用JAXB提供的注解来进行定义。比如,使用@XmlRootElement注解来指定根元素,使用@XmlElement注解来指定元素,使用@XmlAttribute注解来指定属性等。 接下来,我们可以使用JAXB提供的工具来生成Java类。可以通过命令行的方式执行xjc命令,将XSD文件转换Java类,也可以通过IDE工具中的插件或者菜单来完成这个过程。 生成的Java类将包含与XML数据对应的字段和方法。我们可以通过调用相关的getter和setter方法来访问和修改这些字段的值。 此外,JAXB还提供了一些其他的功能,例如将Java对象序列化成XML数据、将XML数据反序列化为Java对象等。 总之,使用JAXB可以根据给定的XML数据自动生成相应的Java实体类内容,使得XML数据与Java对象之间的转换更加方便和简洁。 ### 回答3: Java使用JAXB可以根据XML数据自动生成实体类内容。JAXBJava架构用于处理JavaXML之间的数据绑定和序列化的技术。使用JAXB可以根据XML的结构自动生成相应的Java类,从而方便地在程序中使用XML数据。 在使用JAXB时,首先需要定义一个XML模式文档(XML Schema),该文档描述了XML数据的结构和约束。然后,使用JAXB提供的工具来生成Java类。通过运行JAXB命令行工具或者使用maven插件,可以将XML模式文档转换Java类。 生成的Java类会根据XML的结构生成对应的属性(与XML元素对应),并提供相应的访问方法。同时,JAXB还可以根据XML中的属性生成对应的Java注解,进一步增强生成的Java类的功能。 使用JAXB生成的实体类可以方便地进行XMLJava对象之间的互相转换,通过调用JAXB提供的方法,可以将XML数据转换Java对象,或将Java对象转换XML数据。在转换过程中,JAXB会自动完成对象属性与XML元素或属性之间的映射,无需开发人员手动解析XML数据。 总之,JAXB是一个强大的工具,可以根据XML数据自动生成实体类内容,简化了JavaXML之间的数据绑定和序列化任务。使用JAXB可以减少在处理XML数据时的开发工作量,提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WalkerShen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值