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>