`
kakajw
  • 浏览: 263404 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何解析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>“ ]]>

 

问题解决!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics