曾经也碰到过类似问题,解决方法是在发送或者解析报文前执行上面的方法将内容转义一下,现在我用dom4j组装如下的报文(报文体中内容传输时加密处理),大致介绍一下上面方法的使用,具体看代码。
importjava.io.StringReader; importjava.io.StringWriter; importjava.math.BigDecimal; importorg.apache.commons.lang.StringEscapeUtils; importorg.dom4j.Document; importorg.dom4j.DocumentHelper; importorg.dom4j.Element; importorg.dom4j.io.OutputFormat; importorg.dom4j.io.SAXReader; importorg.dom4j.io.XMLWriter; importcom.thoughtworks.xstream.core.util.Base64Encoder; /** * @ClassName: XmlEscapeTest * @Description: dom4j组装xml报文测试,转义问题处理 * @author@zjf * @date 2019年1月5日 * */ public classXmlEscapeTest { public static voidmain(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("---------报文传输过程中可能出现的“ < > ”转义为“ < > ”--------------"); System.out.println(StringEscapeUtils.escapeXml(document.asXML())); System.out.println(" "+"******************分割线********************"+" "); //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: 自定义加密的报文体内容 * @returnString */ public staticString 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 = newBase64Encoder(); String comment =encoder.encode(detailXml.getBytes()); returncomment; } /** * @Title: format * @Description: 格式化输出xml字符串 * @paramstr * @returnString * @throwsException */ public static String format(String str) throwsException { SAXReader reader = newSAXReader(); //创建一个串的字符输入流 StringReader in = newStringReader(str); Document doc =reader.read(in); //创建输出格式 OutputFormat formater =OutputFormat.createPrettyPrint(); //设置xml的输出编码 formater.setEncoding("utf-8"); //创建输出(目标) StringWriter out = newStringWriter(); //创建输出流 XMLWriter writer = newXMLWriter(out, formater); //输出格式化的串到目标中,执行后。格式化后的串保存在out中。 writer.write(doc); writer.close(); //返回格式化后的结果 returnout.toString(); } }
输出如下: