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方法之标签自闭合问题相关推荐

  1. vue 给标签添加data属性_在Vue中获取自定义属性方法:data-id的实例

    获取自定义属性的方法: 第一步:首先在标签上绑定上@click="getDateId(item.id)",并将属性值传到绑定的事件里面 第二步:在标签上继续绑定:date-id = ...

  2. java document to xml_Java Document.asXML方法代碼示例

    本文整理匯總了Java中org.dom4j.Document.asXML方法的典型用法代碼示例.如果您正苦於以下問題:Java Document.asXML方法的具體用法?Java Document. ...

  3. C语言中常用计时方法总结

    转自:http://blog.csdn.net/fz_ywj/article/details/8109368 C语言中常用计时方法总结 1. time() 头文件:time.h 函数原型:time_t ...

  4. Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

    1. Mybatis工作流程 1.1 使用MySQL创建数据库girls并生成一个表boys,如下图. 1.2 创建该表对应的简单实体类Boys,如下图. 1.3 创建Dao接口以及和接口同名的map ...

  5. java定义final_Java中何时将方法声明为final的

    Java中何时将方法声明为final的 (2014-01-20 11:21:28) 标签: final it Java中final关键是不像volatile和transient如此神秘,但在程序员心中 ...

  6. keep alive PHP,vue中keep-alive使用方法详解

    这次给大家带来vue中keep-alive使用方法详解,vue中keep-alive使用的注意事项有哪些,下面就是实战案例,一起来看一下. 1.keep-alive的作用以及好处 在做电商有关的项目中 ...

  7. 在 IntelliJ IDEA 中误添加自定义的 JavaDoc 标签,如何删除

    在 IntelliJ IDEA 中误添加自定义的 JavaDoc 标签,如何删除 运行环境: IntelliJ IDEA 2020.1.2 (Ultimate Edition)   笔者使用 Inte ...

  8. UIView中常用的方法

    UIView 中常见的方法总结 addSubview:  添加一个子视图到接收者并让它在最上面显示出来.  - (void)addSubview:(UIView *)view  讨论  这方法同样设置 ...

  9. 矢量图标库如何引入html,Iconfont矢量图标库在网站中的使用方法

    原标题:Iconfont矢量图标库在网站中的使用方法 大家都知道现在移动端网站设计比较热门,由于移动端的网站页面的收缩性要求很高,必然在网页设计中,一些小点的图标,使用图片收缩性,以及美观上并不是很理 ...

最新文章

  1. System.Transactions深入了解
  2. java中注解动态传参_SpringMVC之注解、传参、返回值及拦截器
  3. Activity-Service-Receiver-Provider
  4. python的基本原理_Python函数基本使用原理详解
  5. 美团王兴评价马云:“我仍然认为他有诚信问题”,大家怎么看?
  6. java核心-多线程-Java多线程编程涉及到包、类
  7. java怎么打增量包_eclipse实现JavaWeb应用增量打包
  8. BABOK - 企业分析(Enterprise Analysis)概要
  9. 大河抽奖盲盒运营版 1.9.12开源版
  10. python 中csv怎么用_python中不同的CSV功能和使用
  11. python image.open函数_PIL.Image.open和cv2.imread的比较与相互转换的方法
  12. C#多态 (小结转载)
  13. 通达信波段王指标公式主图_通达信精选指标——组合波段王果断买入井喷金叉突破均线流公式...
  14. scala json处理入门
  15. 《Java开发实战经典》PDF+随书视频
  16. go 条件变量简介 sync.Cond
  17. 数学建模竞赛论文写作规范
  18. Microcontent - 微内容
  19. python 小程序
  20. 邮箱POP3、SMTP和IMAP

热门文章

  1. 蜗牛学院:未来10年,程序员的工资会怎么样?
  2. 挑战光纤?电话线上也能实现10Gbps宽带
  3. Ubuntu源码编译安装开源飞信OpenFetion
  4. 神舟K550D三系统(win10、OSX、Ubuntu)安装教程
  5. T31训练营 DAY7
  6. 99%有效解决- Mac双屏时程序坞(任务栏)跑到副屏
  7. [Processing学习]ControlP5-02-knob
  8. 仿美团App-android-java
  9. 精心筹备半年 :appium2.0+ 单点触控和多点触控新的解决方案
  10. Coinbase今日上市,加密市场提前暴涨,行情接下来怎么走?