前言

在看本篇文章之前,先探讨一下常见的两种数据格式,一种是 JSON,另外一种就是 XML,在日常工作中不可避免地都会对这两种数据格式进行接触。

JSON 格式灵活,有大量的支持库,操作起来极为方便;而 XML 操作起来就不是很顺手了。 JSON 格式灵活的就会导致结构不够统一规范,而 XML 有了 XML Schema 以及 DTD 约束进行校验,也减少了数据格式不规范的问题。

对于以上这点,个人是深有体会,因为在工作中需要经常和其他公司的技术打交道。公司合作有内容输出以及内容引入两种,内容引入就是去抓取其他公司的授权接口内容,文档制定的数据格式是 JSON 的,但是可能对方参照我方文档进行接口开发时,会忽略掉一些事项,比如数据类型、时间格式等等,造成我方抓取之后,出现错误的情况;

而在和百度内容输出进行接口对接的时候,百度需要 XML 格式的数据,如果我方接口中的数据不符合对方的 XML 约束的话,对方就能马上停止抓取,反馈问题,由此避免错误情况的发生。

平时为了图方便,很多接口都使用 JSON,对于 XML 也比较生疏,但还是不可避免接触到使用,开发过微信公众号的都知道,微信接口基本都使用的是 XML。在开发了微信图文回复之后,需要组装 XML 发送给微信服务器,可能有人说,那用字符串拼装不也是可以的么,干嘛那么麻烦非要用 DOM4J 呢?确实公司中一些项目的微信支付,也使用的是字符串拼接 XML 的方式,但是多掌握一些技术也并不是什么坏事!

环境准备

首先引入 dom4j 依赖

1
2
3
4
5
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.0</version>
</dependency>

需求

接到需求,要求用户发送作品名称,自动图文回复搜索相关作品,微信的接口是这样的:

需要的 XML 文档格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml>

需求实现

其实这个接口也就是组装数据,然后发送给微信就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static void main(String[] args) {

// 1. 创建文档对象
Document doc = DocumentHelper.createDocument();

// 2. 新增根节点
Element rootXML = doc.addElement("xml");

// 3. 向根节点添加子节点
rootXML.addElement("ToUserName").addCDATA("toUser");
rootXML.addElement("FromUserName").addCDATA("fromUser");
rootXML.addElement("CreateTime").setText("12345678");
rootXML.addElement("MsgType").addCDATA("news");
rootXML.addElement("ArticleCount").setText("2");

// 创建节点
Element subElement = DocumentHelper.createElement("Articles");
for (int i = 0; i < 2; i++) {
Element itemElement = DocumentHelper.createElement("item");
itemElement.addElement("Title").addCDATA("title");
itemElement.addElement("Description").addCDATA("description");
itemElement.addElement("PicUrl").addCDATA("picurl");
itemElement.addElement("Url").addCDATA("url");
subElement.add(itemElement);
}
// 向根节点追加节点
rootXML.add(subElement);

// 4. 输出xml字符串
System.out.println(rootXML.asXML());
}

小结

最近博客文章都是个人的总结性文章,没有涉及什么难的技术,希望对你有所帮助!