Java使用Dom操作生成XML格式的字符串
业务场景
调用服务方的接口,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字符串应该是可行的,且听起来就比较正统,这次主要是同名标签出现多次的问题,无论我是用集合还是数组还是字典,最后序列化出来的字符串,总有一层多余的重复标签,如果可以把外面的给去掉就好了
GG
MM
参考文献
- java 生成xml并转为字符串的方法_java_脚本之家 (jb51.net)