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

}

輸出如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM