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

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

<?xml version="1.0" encoding="UTF-8"?> 
<result>
 <service> 
  <service_name>extractService</service_name> 
  <service_permission><![CDATA[<auths> <auth> <data>re_org</data> <oper>read</oper> </auth> </auths>]]></service_permission> 
 </service>  
</result>

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

<?xml version="1.0" encoding="UTF-8"?> 
<result>
 <service> 
  <service_name>extractSrevice</service_name> 
  <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> 
 </service>  
</result>

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

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或文本输出。

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

<?xml version="1.0" encoding="UTF-8"?>

<result>
  <head>
    <stat>0</stat>
    <message>success</message>
    <npage>0</npage>
  </head>
  <body>
    <services>
      <service>
        <service_name>addPerson</service_name>
        <desc>人员增加</desc>
        <wsdl>http://192.168.3.162:8080/resource_0010/services/resource?wsdl</wsdl>
        <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>
      </service>
      <service>
        <service_name>deletPersom</service_name>
        <desc>人员裁减</desc>
        <wsdl>http://192.168.3.162:8080/resource_0011/services/resource?wsdl</wsdl>
        <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>
      </service>
    </services>
  </body>
</result>






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值