Dom4j中使用asXML方法之節點自閉和問題

1 asXML方法概述

  在使用Dom4j的時候,有時候須要將一個Document對象或Element對象轉換爲一個String,能夠直接調用Document.asXML()方法來實現。java

  其中:Element對象的element.asXML();指的是這個節點(元素)的開始到結束包含的內容組成String;Document 對象的document.asXML()就是將整個文件組成一個String。dom

  可是,在使用這個法法的時候出現瞭如下問題:例如,我原始xml報文中有一節點<SN></SN>,其節點信息中無內容,正常顯示即爲「<SN></SN>」;可是在調用了Document對象或Element對象的asXML方法以後,發現其節點變爲:「<SN/>」,其節點自封閉;若是是通常信息傳輸可能沒有問題,可是若是要對這一段報文作加解密處理時:甲發送報文時爲完整的節點信息,如「<SN></SN>」;但是乙方接收報文後對報文進行驗籤的時候,若是使用了asXML方法,則獲得的原始數據可能就會發生變化(例如:部份內容由<SN></SN>變爲<SN/>),此時會形成驗籤或者減密失敗;spa

2 解決方案

  本身封裝asXml方法,解決節點內容爲空時的自封閉問題。主要代碼是:format.setExpandEmptyElements(true); 若爲false則自閉合code

 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 }

輸出結果:orm

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

結果對比:xml

相關文章
相關標籤/搜索