微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml中“ < > ”转义为“ < > ”问题处理

分享图片

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

}

输出如下:

分享图片

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。