Dom4j中使用asXML方法之节点自闭和问题

1 asXML方法概述

  在使用Dom4j的时候,有时候需要将一个Document对象或Element对象转换为一个String,可以直接调用Document.asXML()方法来实现。

  其中:Element对象的element.asXML();指的是这个节点(元素)的开始到结束包含的内容组成String;Document 对象的document.asXML()就是将整个文件组成一个String。

  但是,在使用这个法法的时候出现了以下问题:例如,我原始xml报文中有一节点,其节点信息中无内容,正常显示即为“”;但是在调用了Document对象或Element对象的asXML方法之后,发现其节点变为:“”,其节点自封闭;如果是一般信息传输可能没有问题,但是如果要对这一段报文做加解密处理时:甲发送报文时为完整的节点信息,如“”;可是乙方接收报文后对报文进行验签的时候,如果使用了asXML方法,则得到的原始数据可能就会发生变化(例如:部分内容由变为),此时会造成验签或者减密失败;

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 = "200001052010104110081711280000处理成功KadnQtpIVovVLmeLCF810dlKCQrpWNgR5jVt0P9ygEp8yjnrhr5nd57dn4Z9bJJzlY2tqyc9HqbgOVY00mycak2HOpR3rq0ntgls8dAmRhCIKHkifVwamIfxG/KqecHs5QW4QjK25ig7nxzog0JknDoASeaiAI6DpKsmbpm0edrwRXamnpo6UDiW9POLoqrQX15jEXpWkPIMNjx5ISH/9GsAi8fr8p6Un+ShdEcKtIpUGBqn1di3mDC7pCV3MBvzcq+dCl9speHdJOQ9ZLsPs2gJkZs0pOeh7OlIP+WGbCRuv7SzV146gjEN40YeYbyvJmN9z1kOXBrOi2GIR3yX5g==17112710103463800090原交易未找到";
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 }

输出结果:

200001052010104110081711280000处理成功KadnQtpIVovVLmeLCF810dlKCQrpWNgR5jVt0P9ygEp8yjnrhr5nd57dn4Z9bJJzlY2tqyc9HqbgOVY00mycak2HOpR3rq0ntgls8dAmRhCIKHkifVwamIfxG/KqecHs5QW4QjK25ig7nxzog0JknDoASeaiAI6DpKsmbpm0edrwRXamnpo6UDiW9POLoqrQX15jEXpWkPIMNjx5ISH/9GsAi8fr8p6Un+ShdEcKtIpUGBqn1di3mDC7pCV3MBvzcq+dCl9speHdJOQ9ZLsPs2gJkZs0pOeh7OlIP+WGbCRuv7SzV146gjEN40YeYbyvJmN9z1kOXBrOi2GIR3yX5g==17112710103463800090原交易未找到
------------------------------------------------------------------------------
17112710103463800090原交易未找到
------------------------------------------------------------------------------
17112710103463800090原交易未找到

结果对比:

Dom4j中使用asXML方法之节点自闭和问题_第1张图片

 

转载于:https://www.cnblogs.com/xq1314/p/7911813.html

你可能感兴趣的:(Dom4j中使用asXML方法之节点自闭和问题)