如何解析XML中的HTML

一、问题提出

问题:现有两个应用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>&lt;button&gt;tes&lt;/button&gt;"quot"'quot'</body> </html>“ 
  </content>
 </mail> 
 标签<content>中包含html文本,如何保证html内容被正确解析?
  
 
二、解决办法
 

1.利用xml转义字符
   什么是xml敏感字符?当进行xml解析时,xml标签的数据若包含(< > & ' ")这5个字符,则解析会报错(为什么会报错呢,google之)。
   什么xml转义字符?为解决上述报错问题,用其他5个字符替换敏感字符,敏感字符会被正常解析为标签数据,这5个用于替换或者转义的字符就是xml的转义字符。
   敏感字符 和转义字符的对应关系如下:


    转义字符  敏感字符   字符描述  
    &lt;           <                小于号
    &gt;          >                大于号
    &amp;      &                和
    &apos;     '                  单引号
    &quot;      "                 双引号
   
    html文本包含很多的xml敏感字符,html文本作为xml标签的数据,若要被正常解析,则将html文本的每个xml敏感字符替换成xml转义字符即可

   因此,A发送xml前将上述xml替换后,如下所示:  
   <?xml version="1.0" encoding="UTF-8"?>
<mail>
  <address>
   888@163.com
  </address> 
  <content>
   "&lt;html&gt;&lt;body&gt;&lt;button&gt;test&lt;/button&gt;&amp;lt;button&amp;gt;tes&amp;lt;/button&amp;gt;&quot;quot&quot;&apos;quot&apos;&lt;/body&gt; &lt;/html&gt;"
  </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>&lt;button&gt;tes&lt;/button&gt;"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>“ ]]>

 

问题解决!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值