Java格式化输出 Dom4j转义字符问题

1,XML CDATA部件:

在XML文档中的所有文本都会被解析器解析。只有在CDATA部件之内的文本会被解析器忽略。不合法的XML字符必须被替换为相应的实体。如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。
< < 小于号
> > 大于号
& &
' ' 单引号
" " 双引号
实体必须以符号"&"开头,以符号";"结尾。 
注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。
CDATA部件:在CDATA内部的所有内容都会被解析器忽略。如果文本包含了很多的"<"字符和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。一个 CDATA 部件以""标记结束;
CDATA注意事项: CDATA部件之间不能再包含CDATA部件(不能嵌套)。如果CDATA部件包含了字符"]]>" 或者""之间没有空格或者换行符。

2,Dom4j格式化转义字符问题:

service.xml

[html] view plain copy print ?
  1. xml version="1.0" encoding="UTF-8"?>   
  2. <result>  
  3.  <service>   
  4.   <service_name>extractServiceservice_name>   
  5.   <service_permission>  re_org read  ]]>service_permission>   
  6.  service>    
  7. result>  
 

  
  extractService 
    re_org read  ]]> 
   

上面的XML在被Dom4j格式化的时候,自动会被转义,转义后的内容如下:

[plain] view plain copy print ?
  1.    
  2.   
  3.     
  4.   extractSrevice   
  5.   <![CDATA[<auths> <auth> <data>re_org</data> <oper>read</oper> </auth> </auths>]]>   
  6.      
  7.   
 

  
  extractSrevice 
  <![CDATA[<auths> <auth> <data>re_org</data> <oper>read</oper> </auth> </auths>]]> 
   

这样,显然不是想要的结果,因为CDATA不需要再转义了。所以在Dom4j中,我们可以这样处理:

[java] view plain copy print ?
  1. public String formatXML_cdata(String inputXML) throws Exception {  
  2.         SAXReader reader = new SAXReader();  
  3.         Document document = reader.read(new StringReader(inputXML));  
  4.         String requestXML = null;  
  5.         XMLWriter xw = null;  
  6.         if (document != null) {  
  7.           try {  
  8.               OutputFormat format = OutputFormat.createPrettyPrint();   
  9.               format.setEncoding("UTF-8");   
  10.               StringWriter sw = new StringWriter();   
  11.               xw = new XMLWriter(sw, format);   
  12.               xw.setEscapeText(false);  
  13.               xw.write(document);  
  14.               requestXML = sw.toString();  
  15.               xw.flush();   
  16.           } finally {  
  17.             if (xw != null) {  
  18.               try {  
  19.                 xw.close();  
  20.               } catch (IOException e) {  
  21.               }  
  22.             }  
  23.           }  
  24.         }  
  25.         return requestXML;  
  26.     }  
public String formatXML_cdata(String inputXML) throws Exception {
	    SAXReader reader = new SAXReader();
	    Document document = reader.read(new StringReader(inputXML));
	    String requestXML = null;
	    XMLWriter xw = null;
	    if (document != null) {
	      try {
	    	  OutputFormat format = OutputFormat.createPrettyPrint(); 
              format.setEncoding("UTF-8"); 
              StringWriter sw = new StringWriter(); 
              xw = new XMLWriter(sw, format); 
              xw.setEscapeText(false);
              xw.write(document);
              requestXML = sw.toString();
              xw.flush(); 
	      } finally {
	        if (xw != null) {
	          try {
	            xw.close();
	          } catch (IOException e) {
	          }
	        }
	      }
	    }
	    return requestXML;
	}

其它同我上篇博文所写相同,在这里特别需要注意的是:

createPrettyPrint():是一个静态辅助方法,可以用来创建漂亮的默认打印格式。此格式会缩进2个空格,修剪每个元素后的空格和其它所有的空白 。

setEscapeText(false):在该功能中,这个函数是很重要的。它决定文本输出是否应该被转义。这是默认启用的,它可以禁用。如果是文本输出格式,如在XSLT中,我们可以有XML,HTML或文本输出。

以下就是我们想要的输出:

[html] view plain copy print ?
  1. xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <result>  
  4.   <head>  
  5.     <stat>0stat>  
  6.     <message>successmessage>  
  7.     <npage>0npage>  
  8.   head>  
  9.   <body>  
  10.     <services>  
  11.       <service>  
  12.         <service_name>addPersonservice_name>  
  13.         <desc>人员增加desc>  
  14.         <wsdl>http://192.168.3.162:8080/resource_0010/services/resource?wsdlwsdl>  
  15.         <service_permissions><auths> <auth> <data>re_orgdata> <oper>readoper> auth> <auth> <data>re_orgdata> <oper>writeoper> auth> <auth> <data>re_orgdata> <oper>read/writeoper> auth> auths>service_permissions>  
  16.       service>  
  17.       <service>  
  18.         <service_name>deletPersomservice_name>  
  19.         <desc>人员裁减desc>  
  20.         <wsdl>http://192.168.3.162:8080/resource_0011/services/resource?wsdlwsdl>  
  21.         <service_permissions><auths> <auth> <data>re_orgdata> <oper>readoper> auth> <auth> <data>re_orgdata> <oper>writeoper> auth> <auth> <data>re_orgdata> <oper>read/writeoper> auth> auths>service_permissions>  
  22.       service>  
  23.     services>  
  24.   body>  
  25. result>  

你可能感兴趣的:(转)