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


  768人阅读  评论(0)  收藏  举报

1,XML CDATA部件:

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

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

service.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <result>  
  3.  <service>   
  4.   <service_name>extractService</service_name>   
  5.   <service_permission><![CDATA[<auths> <auth> <data>re_org</data> <oper>read</oper> </auth> </auths>]]></service_permission>   
  6.  </service>    
  7. </result>  

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

[plain]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <result>  
  3.  <service>   
  4.   <service_name>extractSrevice</service_name>   
  5.   <service_permission>&lt;![CDATA[&lt;auths&gt; &lt;auth&gt; &lt;data&gt;re_org&lt;/data&gt; &lt;oper&gt;read&lt;/oper&gt; &lt;/auth&gt; &lt;/auths&gt;]]&gt;</service_permission>   
  6.  </service>    
  7. </result>  

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

[java]  view plain copy
  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.     }  

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

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

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

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

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <result>  
  4.   <head>  
  5.     <stat>0</stat>  
  6.     <message>success</message>  
  7.     <npage>0</npage>  
  8.   </head>  
  9.   <body>  
  10.     <services>  
  11.       <service>  
  12.         <service_name>addPerson</service_name>  
  13.         <desc>人员增加</desc>  
  14.         <wsdl>http://192.168.3.162:8080/resource_0010/services/resource?wsdl</wsdl>  
  15.         <service_permissions><auths> <auth> <data>re_org</data> <oper>read</oper> </auth> <auth> <data>re_org</data> <oper>write</oper> </auth> <auth> <data>re_org</data> <oper>read/write</oper> </auth> </auths></service_permissions>  
  16.       </service>  
  17.       <service>  
  18.         <service_name>deletPersom</service_name>  
  19.         <desc>人员裁减</desc>  
  20.         <wsdl>http://192.168.3.162:8080/resource_0011/services/resource?wsdl</wsdl>  
  21.         <service_permissions><auths> <auth> <data>re_org</data> <oper>read</oper> </auth> <auth> <data>re_org</data> <oper>write</oper> </auth> <auth> <data>re_org</data> <oper>read/write</oper> </auth> </auths></service_permissions>  
  22.       </service>  
  23.     </services>  
  24.   </body>  
  25. </result>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值