曾经也碰到过类似问题,解决方法是在发送或者解析报文前执行上面的方法将内容转义一下,现在我用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("---------报文传输过程中可能出现的“ < > ”转义为“ < > ”--------------"); 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: 自定义加密的报文体内容 * @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(); } }
输出如下: