文章目录
- 了解jaxb
- 实体类
- 测试类
- 输出结果:
- 其他注解详解
了解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属性。