1,XML CDATA部件:
在XML文档中的所有文本都会被解析器解析。只有在CDATA部件之内的文本会被解析器忽略。不合法的XML字符必须被替换为相应的实体。如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
注意: 只有"<" 字符和"&"字符对于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><![CDATA[<auths> <auth> <data>re_org</data> <oper>read</oper> </auth> </auths>]]></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>