项目中需要解析接收到的xml报文,由于字段太多,就需要有映射技术来解决,传统的dom4j操作起来就过于繁琐。因为要响应的数据也需要转化成xml格式,所有选用该技术还是比较方便的。
1.JAXB的作用
**JAXB(Java Architecture for XML Binding)是J2SE和J2EE平台的一部分,让开发者能够快速完成Java类和XML的互相映射。
2.常用术语:
**Marshal:将Java对象转换为XML的过程
**UnMarshal:将XML转换为Java对象的过程
3.两种实现方式
**JAXB 的 xjc 工具定义 schema 通过XSD(XML Schema Definition)文档生成Java类的方式。
第一种方式比较通用,但需要使用者具有熟练的XSD编写经验。
**Java Annotation 注解 JAXB通过分析java类中的标记(annotation),将java类转换为相应的XML文档。
第二种方案,必须是编程人员手工添加这些标记(注解标记)。
4.对外提供的接口有三个
(1)JAXBContext 类
##应用的入口,用于管理XML/Java绑定信息。
(2)Marshaller 接口
##将Java对象序列化为XML数据。
(3)Unmarshaller 接口
##将XML数据反序列化为Java对象。
5.常用注解
@XmlRootElement 类级别的注解。将类映射为xml全局元素,也就是根元素。如果要使用 JAXB ,则该注解必不可少。
@XmlType 类级别的注解
参数 name 定义XML Schema中type的名称
参数 propOrder 指定映射XML时的节点顺序,使用该属性时,必须列出JavaBean对象中的所有字段,否则会报错。
@XmlAccessorType 类级别的注解。定义这个类中的何种类型需要映射到XML。
XmlAccessType.FIELD:映射这个类中的所有字段到XML
@XmlElement 字段,方法,参数级别的注解。该注解可以将被注解的(非静态)字段,或者被注解的get/set方法对应的字段映射为本地元素,也就是子元素。
/**
* 将java序列化为xml
*/
public static void java2xml(ROOT req_root) throws JAXBException {
//获取上下文环境 将java的bean和要转化的xml进行绑定
JAXBContext jaxbContext = JAXBContext.newInstance(ROOT.class);
//创建 Marshaller 实例(序列化)
Marshaller marshaller = jaxbContext.createMarshaller();
// 设置转换参数 -> 这里举例是告诉序列化器是否格式化输出
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 构建输出环境 -> 这里使用标准输出,输出到控制台Console
PrintStream out = System.out;
// 将所需对象序列化 -> 该方法没有返回值
marshaller.marshal(req_root, out);
}
/**
* 将xml反序列化为java
*/
public static void xml2java(String xml) throws JAXBException {
// 获取JAXB的上下文环境,需要传入具体的 Java bean -> 这里使用Student
JAXBContext context = JAXBContext.newInstance(ROOT.class);
// 创建 UnMarshaller 实例
Unmarshaller unmarshaller = context.createUnmarshaller();
// 加载需要转换的XML数据 -> 这里使用InputStream,还可以使用File,Reader等
//InputStream stream = SimpleTest.class.getClassLoader().getResourceAsStream("lesson1.xml");
StringReader reader = new StringReader(xml);
// 将XML数据序列化 -> 该方法的返回值为Object基类,需要强转类型
ROOT req_root = (ROOT) unmarshaller.unmarshal(reader);
// 将结果打印到控制台
System.out.println(req_root);
String std400acur = req_root.getStd400acur();
//可以直接从获取的
System.out.println(std400acur);
}