xml中“ < > ”转义为“ &lt; &gt; ”问题处理

曾经也碰到过类似问题,解决方法是在发送或者解析报文前执行上面的方法将内容转义一下,现在我用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("
"+"******************分割线********************"+"
");

        // 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();
    }

}

输出如下:

原文地址:https://www.cnblogs.com/zjfjava/p/10225665.html