importjava.io.StringReader;importjava.io.StringWriter;importjava.math.BigDecimal;importorg.apache.commons.lang.StringEscapeUtils;importorg.dom4j.Document;importorg.dom4j.DocumentHelper;importorg.dom4j.Element;importorg.dom4j.io.OutputFormat;importorg.dom4j.io.SAXReader;importorg.dom4j.io.XMLWriter;importcom.thoughtworks.xstream.core.util.Base64Encoder;/*** @ClassName: XmlEscapeTest
* @Description: dom4j组装xml报文测试,转义问题处理
*@author@zjf
* @date 2019年1月5日
**/
public classXmlEscapeTest {public static voidmain(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("---------报文传输过程中可能出现的“ < > ”转义为“ < > ”--------------");
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: 自定义加密的报文体内容
*@returnString*/
public staticString 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 = newBase64Encoder();
String comment=encoder.encode(detailXml.getBytes());returncomment;
}/*** @Title: format
* @Description: 格式化输出xml字符串
*@paramstr
*@returnString
*@throwsException*/
public static String format(String str) throwsException {
SAXReader reader= newSAXReader();//创建一个串的字符输入流
StringReader in = newStringReader(str);
Document doc=reader.read(in);//创建输出格式
OutputFormat formater =OutputFormat.createPrettyPrint();//设置xml的输出编码
formater.setEncoding("utf-8");//创建输出(目标)
StringWriter out = newStringWriter();//创建输出流
XMLWriter writer = newXMLWriter(out, formater);//输出格式化的串到目标中,执行后。格式化后的串保存在out中。
writer.write(doc);
writer.close();//返回格式化后的结果
returnout.toString();
}
}