业务场景
调用服务方的接口,post方式请求,content-type = application/xml,所以请求体需要使用xml字符串;同时由于用到了多个同名标签作为数组表示多个值,我尝试构造对象后使用 jackson序列化成字符串,失败了 2333,好在本次请求体结构并不复杂,简单使用dom文档树操作就好了
技术实现
虚空代码
- 创建Dom树,创建根节点和子节点;创建节点时设置其属性和值,然后按照嵌套关系进行引用形成一颗文档数
- 创建可以转换器,这个转换器可以把文档树转换成想要的格式,本次为XML格式
- 输出转换后的xml,可以输出成xml文件保存到硬盘上,或者输出成xml字符串,只需驻留在内存中用一下下就好了
实际开发
- 构建Dom树
// 构建请求体
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
Document document = builder.newDocument();
// 创建根节点
Element rootEle = document.createElement("request");
// 循环创建子节点并加入父节点
for (String tempId : tempIdList) {
Element tempEle = document.createElement("templateIDs");
tempEle.setTextContent(tempId);
rootEle.appendChild(tempEle);
}
document.appendChild(rootEle);
//隐藏 XML文件 standalone 属性,不加此句你试试,在首航的xml文档声明中会多个属性,用不用随你
document.setXmlStandalone(true);
- 构建转换器,输出xml字符串
//隐藏 XML文件 standalone 属性
document.setXmlStandalone(true);
//..将 dom树转换为 XML文件
//创建 TransformerFactory 对象
TransformerFactory tff = TransformerFactory.newInstance();
//创建 Transformer 对象
Transformer tf = tff.newTransformer();
//设置生成的 XML 文件自动换行
tf.setOutputProperty(OutputKeys.INDENT, "yes");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
tf.transform(new DOMSource(document), new StreamResult(bos));
return bos.toString();
- 也可以输出成xml文件的
//使用 Transformer 的 transform 方法把Dom树转换成 XML 文件
tf.transform(new DOMSource(document), new StreamResult(new File("request.xml")));
每日小结
我认为这种方法不好,构造对象后再序列化成xml字符串应该是可行的,且听起来就比较正统,这次主要是同名标签出现多次的问题,无论我是用集合还是数组还是字典,最后序列化出来的字符串,总有一层多余的重复标签,如果可以把外面的给去掉就好了
<request>
<templateIDs><templateIDs>GG</templateIDs>
<templateIDs>MM</templateIDs></templateIDs>
</request>