文章目录
- 前言
- 一、xjc & trang.jar 生成 java code
- 二、IntelliJ IDEA Tools 生成 java code
- 三、XML 与 JavaBean 的映射
- 四、JavaBean 的校验
前言
Document doc = DocumentHelper.parseText(xml);
Element root = doc.getRootElement();
Element body = root.element("body");
// ...
XmlBean bean = new XmlBean();
bean.setBody(body.getTextTrim());
bean.setXXX..
// ...
上面一段代码是使用 dom4j 解析 xml 文件的过程, xml 中每个节点需要映射到 javabean 中。当节点数量太多时,解析 xml 以及定义 javabean 效率都非常的低。目前网上已经有解决方法,首先根据 xml 生成 xsd 文件,再根据 xsd 生成 java 文件,最后在业务代码中完成 xml 与 javabean 的映射。
一、xjc & trang.jar 生成 java code
使用 trang.jar 生成 xsd 文件,也可以去 mvnrepository 找到 jar 包。在 trang.jar 的目录输入如下 cmd 命令,生成 xsd 文件。
java -jar trang.jar person.xml person.xsd
使用 xjc 生成 java 文件,jdk 的 bin 目录下有 xjc.exe 程序文件,在 bin 目录下输入如下 cmd 命令,生成 java 文件。
xjc D:\软件下载\xml2java\person.xsd -p com.frog -d D:\软件下载\xml2java\
xjc 执行文件 -p 包名 -d 输入目录
person.xml 文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<personnel id="TEST_ID" comment="求职">
<body>
<name>张三</name>
<age>25</age>
<desc>程序员</desc>
<edubackground count="2">
<education xh="1">
<school>北大</school>
<level>本科</level>
<year>4</year>
<other/>
</education>
<education xh="2">
<school>北大</school>
<level>硕士</level>
<year>3</year>
<other/>
</education>
</edubackground>
</body>
</personnel>
二、IntelliJ IDEA Tools 生成 java code
使用 IntelliJ IDEA Tools 可以更简单的完成以上操作,将 person.xml 文件放在工程任意目录下,选中并依次点击 IDEA 菜单 Tools → Xml Actions → Generate Schema From Instance Doucument,自定义配置后点击 OK 生成 xsd 文件。
Design type 可以有三种选项,不同的选项导致生成xsd的结构也不同,生成的 java 类的结构也不相同,选项二符合代码习惯 ,如果需要内部类的结构选择选项三。
Detect simple content type 可以选择 string/smart,一般 xml 报文中节点值都为 string 类型。
选中刚才生成的 xsd 文件,依次点击 IDEA 菜单 Tools → JAXB → Generate Java Code From Xml Schema using JAXB…,填写包名等内容后生成 java 文件。
生成 java 文件默认 GBK 格式,入不想要生成的注释可以使用正则表达式去除 /\*[\w\W]*?\*/
三、XML 与 JavaBean 的映射
使用如下工具类完成 XML 与 JavaBean 的相互转换。
public class Xml2BeanProcessor {
@SuppressWarnings("unchecked")
public static <T> T covertBean(String xml, Class<T> c) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = context.createUnmarshaller();
return (T) unmarshaller.unmarshal(new StringReader(xml));
}
public static <T> String convertXml(T t) throws JAXBException {
return convertXml(t, "UTF-8");
}
public static <T> String convertXml(T t, String encoding) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(t.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter writer = new StringWriter();
marshaller.marshal(t, writer);
return writer.toString();
}
}
四、JavaBean 的校验
下载 verifybean.jar 或添加本地 maven 仓库后添加依赖,完成简单的 Bean 校验。
Validator.verify(new TestBean());
可以在需要校验的 Bean 上添加注解,更灵活的配置校验规则。
@VerifiableBean(level = VerifiableLevel.NOTBLANK, propagation = VerifiablePropagation.RECURSIVE)
public class TestBean {
//...
}