曾经也碰到过类似问题,解决方法是在发送或者解析报文前执行上面的方法将内容转义一下,现在我用dom4j组装如下的报文(报文体中内容传输时加密处理),大致介绍一下上面方法的使用,具体看代码。

import java.io.StringReader;
import java.io.StringWriter;
import java.math.BigDecimal; import org.apache.commons.lang.StringEscapeUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter; import com.thoughtworks.xstream.core.util.Base64Encoder;
/**
* @ClassName: XmlEscapeTest
* @Description: dom4j组装xml报文测试,转义问题处理
* @author @zjf
* @date 2019年1月5日
*
*/
public class XmlEscapeTest { public static void main(String[] args) {
Document document = DocumentHelper.createDocument();
document.setXMLEncoding("utf-8"); // 默认utf-8 Element rootElement = document.addElement("SERVICE");
rootElement.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
// 自定义组装报文头
Element headElement = rootElement.addElement("HEAD");
headElement.addElement("serviceversion").addText("1.3");
headElement.addElement("serviceid").addText("jy.dzptfpkj");
headElement.addElement("iszip").addText("N");
headElement.addElement("encryptcode").addText("0");
// 报文体自定义组装,内容加密
rootElement.addElement("BODY");
String bodyText = encodeBodyText();
rootElement.element("BODY").addText(bodyText); System.out.println("---------报文传输过程中可能出现的“ < > ”转义为“ &lt; &gt; ”--------------");
System.out.println(StringEscapeUtils.escapeXml(document.asXML()));
System.out.println("\n"+"******************分割线********************"+"\n"); // xml文件"< >"禁止转义,保留<>样式的方法 (无论是否存在转义问题,都在此处统一一下格式)
String xml = StringEscapeUtils.unescapeXml(document.asXML()); // 格式化输出
String xmlFormat = null;
try {
xmlFormat = format(xml);
} catch (Exception e) {
e.printStackTrace();
} System.out.println("------------格式化输出报文-----------------");
System.out.println(xmlFormat);
} /**
* @Title: encodeBodyText
* @Description: 自定义加密的报文体内容
* @return String
*/
public static String encodeBodyText() {
Document document = DocumentHelper.createDocument();
document.setXMLEncoding("utf-8"); // 默认utf-8
Element detailElement = document.addElement("DETAIL");
detailElement.addElement("name").addText("小刚");
detailElement.addElement("age").addText("25");
detailElement.addElement("money").addText(new BigDecimal("152.220").toPlainString());
String detailXml = document.getRootElement().asXML();
// 加密内容
Base64Encoder encoder = new Base64Encoder();
String comment = encoder.encode(detailXml.getBytes());
return comment;
} /**
* @Title: format
* @Description: 格式化输出xml字符串
* @param str
* @return String
* @throws Exception
*/
public static String format(String str) throws Exception {
SAXReader reader = new SAXReader();
// 创建一个串的字符输入流
StringReader in = new StringReader(str);
Document doc = reader.read(in);
// 创建输出格式
OutputFormat formater = OutputFormat.createPrettyPrint();
// 设置xml的输出编码
formater.setEncoding("utf-8");
// 创建输出(目标)
StringWriter out = new StringWriter();
// 创建输出流
XMLWriter writer = new XMLWriter(out, formater);
// 输出格式化的串到目标中,执行后。格式化后的串保存在out中。
writer.write(doc);
writer.close();
// 返回格式化后的结果
return out.toString();
} }

输出如下:

最新文章

  1. 解决浏览器Adobe Flash Player不是最新版本问题
  2. DLL函数中内存分配及释放的问题
  3. C文件操作(全)
  4. python sleep
  5. Authentication for the REST APIs
  6. WebResource.axd文件的配置和使用
  7. PHP 8: PHP的运算符
  8. jmeter3 测试soap协议-webservice接口
  9. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习4
  10. IP,IP地址,mac地址
  11. 使用contenteditable=true的div模拟textarea(vue2.0中使用,带placeholder且高度自动撑开)
  12. docker nginx letsencrypt
  13. Hibernate 5 入门指南-基于类注解
  14. python爬虫慕课基础2
  15. inception v1-v3 &amp; Xception
  16. css3和html5
  17. 安装jdk1.8
  18. 我仅使用到的dd if
  19. 《剑指offer》第五十九题(滑动窗口的最大值)
  20. C++学习(三十四)(C语言部分)之 链表

热门文章

  1. 算法: skiplist 跳跃表代码实现和原理
  2. 再议FastReport.NET(转)
  3. SiteMapPath基本用法
  4. 10 个非常有用的 SVG 动画的 JavaScript 库
  5. printf()详解之终极无惑
  6. LigerUI之Grid使用详解(一)——显示数据
  7. python 爬虫随机获取User-Agent
  8. Spring(二十二):Spring 事务
  9. 我的四轴专用PID参数整定方法及原理---超长文慎入(转)
  10. JavaScript中一个对象如何继承另外一个对象