使用JAXB2解析xml

了解jaxb

JAXB技术是Javax包下的解析xml的技术,javax.xml.包下,
JAXBContext Jaxb的上下文,通过这个对象我们能拿到另外两个核心对象Unmarshaller(用于解析xml)和Marshaller(生成xml)

实体类

对应xml的实体类:

import javax.xml.bind.annotation.*;

//@XmlRootElement(name = "user", namespace = "http://s3.amazonaws.com/doc/2006-03-01/")
@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {

    @XmlElement
    private Attr password;

    @XmlElement(name = "name")
    private String name;

    @XmlElement(name = "age")
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Attr getPassword() {
        return password;
    }

    public void setPassword(Attr password) {
        this.password = password;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
            "password=" + password +
            ", name='" + name + '\'' +
            ", age='" + age + '\'' +
            '}';
    }
}

@XmlAccessorType(value = XmlAccessType.FIELD)
class Attr {

    @XmlAttribute(name = "id")
    private String id;

    @XmlAttribute(name = "secret")
    private String secret;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getSecret() {
        return secret;
    }

    public void setSecret(String secret) {
        this.secret = secret;
    }
}

对应的xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><password id="333" secret="@#$"/><name>nicole</name><age>18</age></user>

测试类

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;

/**
 * @author <a href="">yida</a>
 * @Version 2020-04-23 16:11
 * @Version 1.0
 * @Description JaxbTest
 */
public class JaxbTest {
  public static void main(String[] args) {
    try {
      //创建JAXBContext对象,注意一定要传@XmlRootElement的所标记的类的类型
      JAXBContext jaxbContext = JAXBContext.newInstance(User.class,Attr.class);
      //拿到xml解析对象
      Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

      String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
          "<user xmls=\"http://s3.amazonaws.com/doc/2006-03-01/\">\n" +
          "    <password id=\"333\" secret=\"@#$\"/>\n" +
          "    <name>nicole</name>\n" +
          "    <age>18</age>\n" +
          "</user>";

      //解析为bean
      User bean  = (User) unmarshaller.unmarshal(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
      System.out.println(bean.toString());

      //将bean解析为xml字符串
      Marshaller marshaller = jaxbContext.createMarshaller();
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
      marshaller.marshal(bean,byteArrayOutputStream);
      byteArrayOutputStream.flush();
      byteArrayOutputStream.close();
      String s = new String(byteArrayOutputStream.toByteArray(), "utf-8");
      System.out.println(s);

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

输出结果:

在这里插入图片描述

其他注解详解

@XmlType,将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
@XmlRootElement,将Java类或枚举类型映射到XML元素。
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
————————————————
版权声明:本文为CSDN博主「周哥~」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhougod88/article/details/53738474

posted @ 2020-04-23 17:46  你就像甜甜的益达  阅读(196)  评论(0编辑  收藏  举报