能不能别再笨拙的处理XML报文了?!


前言

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 {
    //...
}

查看详细的使用文档

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值