zoukankan      html  css  js  c++  java
  • 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();
        }
    
    }

    输出如下:

  • 相关阅读:
    记一次手工端假设之旅
    宝塔面板相关笔记
    linux ubuntu centos 相关笔记
    问题解决笔记,Restarting network (via systemctl):: Job for network.service failed. ...
    Ubuntu中使用yum
    小说爬取 python + urllib + lxml
    wsgiref错误解决笔记 "write() argument must be a bytes instance"
    个人作品导航:
    django基础一
    前端小知识(5)--响应式页面实现
  • 原文地址:https://www.cnblogs.com/zjfjava/p/10225665.html
Copyright © 2011-2022 走看看