Dom4j中使用asXML方法之标签自闭合问题
1 asXML方法概述
在使用Dom4j的时候,有时候需要将一个Document对象或Element对象转换为一个String,可以直接调用Document.asXML()方法来实现。
其中:Element对象的element.asXML();指的是这个节点(元素)的开始到结束包含的内容组成String;Document 对象的document.asXML()就是将整个文件组成一个String。
但是,在使用这个法法的时候出现了以下问题:例如,我原始xml报文中有一节点<SN></SN>,其节点信息中无内容,正常显示即为“<SN></SN>”;但是在调用了Document对象或Element对象的asXML方法之后,发现其节点变为:“<SN/>”,其节点自封闭;如果是一般信息传输可能没有问题,但是如果要对这一段报文做加解密处理时:甲发送报文时为完整的节点信息,如“<SN></SN>”;可是乙方接收报文后对报文进行验签的时候,如果使用了asXML方法,则得到的原始数据可能就会发生变化(例如:部分内容由<SN></SN>变为<SN/>),此时会造成验签或者减密失败;
2 解决方案
自己封装asXml方法,解决节点内容为空时的自封闭问题。主要代码是:format.setExpandEmptyElements(true); 若为false则自闭合。
// 转换为标准格式(避免自闭合的问题)private static String asXml(Element body) {OutputFormat format = new OutputFormat();format.setEncoding("UTF-8");format.setExpandEmptyElements(true);StringWriter out = new StringWriter();XMLWriter writer = new XMLWriter(out, format);try {writer.write(body);writer.flush();} catch (IOException e) {e.printStackTrace();}return out.toString();}
3 java代码示例
package xin.dreaming.dom4j;import java.io.IOException;
import java.io.StringWriter;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.junit.Test;public class Dom4jTest {@Testpublic void dom4jTest() throws DocumentException {String xmlStr = "<?xml version=\"1.0\" encoding=\"GBK\"?><GZELINK><INFO><TRX_CODE>200001</TRX_CODE><VERSION>05</VERSION><DATA_TYPE>2</DATA_TYPE><LEVEL>0</LEVEL><REQ_SN>1010411008171128</REQ_SN><RET_CODE>0000</RET_CODE><ERR_MSG>处理成功</ERR_MSG><SIGNED_MSG>KadnQtpIVovVLmeLCF810dlKCQrpWNgR5jVt0P9ygEp8yjnrhr5nd57dn4Z9bJJzlY2tqyc9HqbgOVY00mycak2HOpR3rq0ntgls8dAmRhCIKHkifVwamIfxG/KqecHs5QW4QjK25ig7nxzog0JknDoASeaiAI6DpKsmbpm0edrwRXamnpo6UDiW9POLoqrQX15jEXpWkPIMNjx5ISH/9GsAi8fr8p6Un+ShdEcKtIpUGBqn1di3mDC7pCV3MBvzcq+dCl9speHdJOQ9ZLsPs2gJkZs0pOeh7OlIP+WGbCRuv7SzV146gjEN40YeYbyvJmN9z1kOXBrOi2GIR3yX5g==</SIGNED_MSG></INFO><BODY><QUERY_TRANS><QUERY_SN>1711271010346380</QUERY_SN><QUERY_REMARK></QUERY_REMARK></QUERY_TRANS><RET_DETAILS><RET_DETAIL><SN></SN><PAY_STATUS></PAY_STATUS><RET_CODE>0090</RET_CODE><ERR_MSG>原交易未找到</ERR_MSG></RET_DETAIL></RET_DETAILS></BODY></GZELINK>";//原xml报文内容System.out.println(xmlStr);System.out.println("------------------------------------------------------------------------------");Document document = DocumentHelper.parseText(xmlStr);// 获取body节点Element body = document.getRootElement().element("BODY");//使用asXML方法转换,打印body内容System.out.println(body.asXML());System.out.println("------------------------------------------------------------------------------");//使用自己封装的axXml(Element element)方法,打印body节点内容System.out.println(asXml(body));}// 转换为标准格式(避免自闭合的问题)private static String asXml(Element body) {OutputFormat format = new OutputFormat();format.setEncoding("UTF-8");format.setExpandEmptyElements(true);StringWriter out = new StringWriter();XMLWriter writer = new XMLWriter(out, format);try {writer.write(body);writer.flush();} catch (IOException e) {e.printStackTrace();}return out.toString();}
}
输出结果:
<?xml version="1.0" encoding="GBK"?><GZELINK><INFO><TRX_CODE>200001</TRX_CODE><VERSION>05</VERSION><DATA_TYPE>2</DATA_TYPE><LEVEL>0</LEVEL><REQ_SN>1010411008171128</REQ_SN><RET_CODE>0000</RET_CODE><ERR_MSG>处理成功</ERR_MSG><SIGNED_MSG>KadnQtpIVovVLmeLCF810dlKCQrpWNgR5jVt0P9ygEp8yjnrhr5nd57dn4Z9bJJzlY2tqyc9HqbgOVY00mycak2HOpR3rq0ntgls8dAmRhCIKHkifVwamIfxG/KqecHs5QW4QjK25ig7nxzog0JknDoASeaiAI6DpKsmbpm0edrwRXamnpo6UDiW9POLoqrQX15jEXpWkPIMNjx5ISH/9GsAi8fr8p6Un+ShdEcKtIpUGBqn1di3mDC7pCV3MBvzcq+dCl9speHdJOQ9ZLsPs2gJkZs0pOeh7OlIP+WGbCRuv7SzV146gjEN40YeYbyvJmN9z1kOXBrOi2GIR3yX5g==</SIGNED_MSG></INFO><BODY><QUERY_TRANS><QUERY_SN>1711271010346380</QUERY_SN><QUERY_REMARK></QUERY_REMARK></QUERY_TRANS><RET_DETAILS><RET_DETAIL><SN></SN><PAY_STATUS></PAY_STATUS><RET_CODE>0090</RET_CODE><ERR_MSG>原交易未找到</ERR_MSG></RET_DETAIL></RET_DETAILS></BODY></GZELINK>
------------------------------------------------------------------------------
<BODY><QUERY_TRANS><QUERY_SN>1711271010346380</QUERY_SN><QUERY_REMARK/></QUERY_TRANS><RET_DETAILS><RET_DETAIL><SN/><PAY_STATUS/><RET_CODE>0090</RET_CODE><ERR_MSG>原交易未找到</ERR_MSG></RET_DETAIL></RET_DETAILS></BODY>
------------------------------------------------------------------------------
<BODY><QUERY_TRANS><QUERY_SN>1711271010346380</QUERY_SN><QUERY_REMARK></QUERY_REMARK></QUERY_TRANS><RET_DETAILS><RET_DETAIL><SN></SN><PAY_STATUS></PAY_STATUS><RET_CODE>0090</RET_CODE><ERR_MSG>原交易未找到</ERR_MSG></RET_DETAIL></RET_DETAILS></BODY>
结果对比:
转自:https://www.cnblogs.com/xq1314/p/7911813.html
Dom4j中使用asXML方法之标签自闭合问题相关推荐
- vue 给标签添加data属性_在Vue中获取自定义属性方法:data-id的实例
获取自定义属性的方法: 第一步:首先在标签上绑定上@click="getDateId(item.id)",并将属性值传到绑定的事件里面 第二步:在标签上继续绑定:date-id = ...
- java document to xml_Java Document.asXML方法代碼示例
本文整理匯總了Java中org.dom4j.Document.asXML方法的典型用法代碼示例.如果您正苦於以下問題:Java Document.asXML方法的具體用法?Java Document. ...
- C语言中常用计时方法总结
转自:http://blog.csdn.net/fz_ywj/article/details/8109368 C语言中常用计时方法总结 1. time() 头文件:time.h 函数原型:time_t ...
- Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
1. Mybatis工作流程 1.1 使用MySQL创建数据库girls并生成一个表boys,如下图. 1.2 创建该表对应的简单实体类Boys,如下图. 1.3 创建Dao接口以及和接口同名的map ...
- java定义final_Java中何时将方法声明为final的
Java中何时将方法声明为final的 (2014-01-20 11:21:28) 标签: final it Java中final关键是不像volatile和transient如此神秘,但在程序员心中 ...
- keep alive PHP,vue中keep-alive使用方法详解
这次给大家带来vue中keep-alive使用方法详解,vue中keep-alive使用的注意事项有哪些,下面就是实战案例,一起来看一下. 1.keep-alive的作用以及好处 在做电商有关的项目中 ...
- 在 IntelliJ IDEA 中误添加自定义的 JavaDoc 标签,如何删除
在 IntelliJ IDEA 中误添加自定义的 JavaDoc 标签,如何删除 运行环境: IntelliJ IDEA 2020.1.2 (Ultimate Edition) 笔者使用 Inte ...
- UIView中常用的方法
UIView 中常见的方法总结 addSubview: 添加一个子视图到接收者并让它在最上面显示出来. - (void)addSubview:(UIView *)view 讨论 这方法同样设置 ...
- 矢量图标库如何引入html,Iconfont矢量图标库在网站中的使用方法
原标题:Iconfont矢量图标库在网站中的使用方法 大家都知道现在移动端网站设计比较热门,由于移动端的网站页面的收缩性要求很高,必然在网页设计中,一些小点的图标,使用图片收缩性,以及美观上并不是很理 ...
最新文章
- System.Transactions深入了解
- java中注解动态传参_SpringMVC之注解、传参、返回值及拦截器
- Activity-Service-Receiver-Provider
- python的基本原理_Python函数基本使用原理详解
- 美团王兴评价马云:“我仍然认为他有诚信问题”,大家怎么看?
- java核心-多线程-Java多线程编程涉及到包、类
- java怎么打增量包_eclipse实现JavaWeb应用增量打包
- BABOK - 企业分析(Enterprise Analysis)概要
- 大河抽奖盲盒运营版 1.9.12开源版
- python 中csv怎么用_python中不同的CSV功能和使用
- python image.open函数_PIL.Image.open和cv2.imread的比较与相互转换的方法
- C#多态 (小结转载)
- 通达信波段王指标公式主图_通达信精选指标——组合波段王果断买入井喷金叉突破均线流公式...
- scala json处理入门
- 《Java开发实战经典》PDF+随书视频
- go 条件变量简介 sync.Cond
- 数学建模竞赛论文写作规范
- Microcontent - 微内容
- python 小程序
- 邮箱POP3、SMTP和IMAP
热门文章
- 蜗牛学院:未来10年,程序员的工资会怎么样?
- 挑战光纤?电话线上也能实现10Gbps宽带
- Ubuntu源码编译安装开源飞信OpenFetion
- 神舟K550D三系统(win10、OSX、Ubuntu)安装教程
- T31训练营 DAY7
- 99%有效解决- Mac双屏时程序坞(任务栏)跑到副屏
- [Processing学习]ControlP5-02-knob
- 仿美团App-android-java
- 精心筹备半年 :appium2.0+ 单点触控和多点触控新的解决方案
- Coinbase今日上市,加密市场提前暴涨,行情接下来怎么走?