zoukankan      html  css  js  c++  java
  • 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则自闭合

     1 // 转换为标准格式(避免自闭合的问题)
     2     private static String asXml(Element body) {
     3         OutputFormat format = new OutputFormat();
     4         format.setEncoding("UTF-8");
     5         format.setExpandEmptyElements(true);
     6         StringWriter out = new StringWriter();
     7         XMLWriter writer = new XMLWriter(out, format);
     8         try {
     9             writer.write(body);
    10             writer.flush();
    11         } catch (IOException e) {
    12             e.printStackTrace();
    13         }
    14         return out.toString();
    15     }

    3 java代码示例

     1 package xin.dreaming.dom4j;
     2 
     3 import java.io.IOException;
     4 import java.io.StringWriter;
     5 
     6 import org.dom4j.Document;
     7 import org.dom4j.DocumentException;
     8 import org.dom4j.DocumentHelper;
     9 import org.dom4j.Element;
    10 import org.dom4j.io.OutputFormat;
    11 import org.dom4j.io.XMLWriter;
    12 import org.junit.Test;
    13 
    14 public class Dom4jTest {
    15 
    16     @Test
    17     public void dom4jTest() throws DocumentException {
    18         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>";
    19         //原xml报文内容
    20         System.out.println(xmlStr);
    21         System.out.println("------------------------------------------------------------------------------");
    22         Document document = DocumentHelper.parseText(xmlStr);
    23         // 获取body节点
    24         Element body = document.getRootElement().element("BODY");
    25         //使用asXML方法转换,打印body内容
    26         System.out.println(body.asXML());
    27         System.out.println("------------------------------------------------------------------------------");
    28         //使用自己封装的axXml(Element element)方法,打印body节点内容
    29         System.out.println(asXml(body));
    30     }
    31 
    32     // 转换为标准格式(避免自闭合的问题)
    33     private static String asXml(Element body) {
    34         OutputFormat format = new OutputFormat();
    35         format.setEncoding("UTF-8");
    36         format.setExpandEmptyElements(true);
    37         StringWriter out = new StringWriter();
    38         XMLWriter writer = new XMLWriter(out, format);
    39         try {
    40             writer.write(body);
    41             writer.flush();
    42         } catch (IOException e) {
    43             e.printStackTrace();
    44         }
    45         return out.toString();
    46     }
    47 }

    输出结果:

    <?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>

    结果对比:

  • 相关阅读:
    【树论】新二叉树
    【贪心】umi的函数
    【模拟】高精度练习之加法
    【模拟】高精度练习之减法
    【贪心】线段覆盖
    【树论】二叉树的序遍历
    【贪心】超级书架
    【动态规划】爱与愁的心痛
    【图论】牛大赛
    【图论】产生数
  • 原文地址:https://www.cnblogs.com/xq1314/p/7911813.html
Copyright © 2011-2022 走看看