一、问题提出
问题:现有两个应用A和B,B接收并解析A发送的XML,XML主要内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<mail>
<address>
888@163.com
</address>
<content>
”<html><body><button>test</button><button>tes</button>"quot"'quot'</body> </html>“
</content>
</mail>
标签<content>中包含html文本,如何保证html内容被正确解析?
二、解决办法
1.利用xml转义字符
什么是xml敏感字符?当进行xml解析时,xml标签的数据若包含(< > & ' ")这5个字符,则解析会报错(为什么会报错呢,google之)。
什么xml转义字符?为解决上述报错问题,用其他5个字符替换敏感字符,敏感字符会被正常解析为标签数据,这5个用于替换或者转义的字符就是xml的转义字符。
敏感字符 和转义字符的对应关系如下:
转义字符 敏感字符 字符描述
< < 小于号
> > 大于号
& & 和
' ' 单引号
" " 双引号
html文本包含很多的xml敏感字符,html文本作为xml标签的数据,若要被正常解析,则将html文本的每个xml敏感字符替换成xml转义字符即可
因此,A发送xml前将上述xml替换后,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<mail>
<address>
888@163.com
</address>
<content>
"<html><body><button>test</button>&lt;button&gt;tes&lt;/button&gt;"quot"'quot'</body> </html>"
</content>
</mail>
这样B就可正确解析A的内容。
2.使用CDATA标签
对于XML解析器,CDATA标签内部的数据都会被当做纯字符串(而非xml内容)原样解析,不管数据中是否包含xml敏感字符。
如:
<![CDATA[I can't see this text <$'"> ]]> 被解析成 I can't see this text <$'">,保持原样不变。
因此,使用CDATA标签可解决上述问题,只需将html文本包含于CDATA标签即可,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<mail>
<address>
888@163.com
</address>
<content>
<![CDATA["<html><body><button>test</button><button>tes</button>"quot"'quot'</body></html>“ ]]>
</content>
</mail>
问题貌似已经解决,但如果html文本中也包含CDATA标签时,解析器也会报错,
因为XML认为嵌套的CDATA标签是不合法的,不允许CDATA嵌套!
如:
<![CDATA[”<html><body><![CDATA[qian tao]]></body></html>“ ]]>
解决办法:解析前,将最外围CDATA包含的 “]]>”替换为“]]]]><![CDATA[>”,解析完成后替换回来即可,嘿嘿!
替换后如下:
<![CDATA[”<html><body><![CDATA[qian tao]]]]><![CDATA[></body></html>“ ]]>
问题解决!