业务场景

调用服务方的接口,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>