1. 程式人生 > >xml中“ < > ”轉義為“ &lt; &gt; ”問題處理

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

輸出如下: