【问题标题】:libxml2 fails to handle CDATA in HTML correctlylibxml2 无法正确处理 HTML 中的 CDATA
【发布时间】:2011-05-30 21:42:10
【问题描述】:

我正在使用 libxml2.2.7.3 来解析 html 页面,但我很难让它与 HTML 中的 CDATA 一起正常工作。代码如下:

xmlDocPtr doc = htmlReadMemory(data, length, "", NULL, 0);
xmlBufferPtr buffer = xmlBufferCreate();
xmlNodeDump(buffer, doc, doc->children, 0, 0);
printf("%s", (char*)buffer->content);

和 HTML 数据:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><body>
  <div>
    <script type="text/javascript"> 
    //<![CDATA[
      document.write('</div>');
    //]]>
    </script>
  </div>
</body></html>

解析器错误地将引号内的

识别为真正的 html 标记,并打印出如下错误消息: :8: HTML 解析器错误:意外的结束标记:脚本 脚本> ^ :9:HTML 解析器错误:意外的结束标记:div

标签: html xml html-parsing libxml2


【解决方案1】:

在 HTML 中,&lt;script&gt; 元素根据定义包含 CDATA,因此 &lt;![CDATA[ 无效。

简而言之,源文档坏了。

该部分更恰当地写为:

<script type="text/javascript"> 
  document.write('<\/div>');
</script>

【讨论】:

  • 嗨,大卫,非常感谢您的及时答复!我了解 CDATA 部分,但如果
    ' 重写为 '
    '?
  • 因为任何结束标签都会终止 CDATA 部分。
  • 太好了,你真的节省了我的时间。非常感谢你,大卫!最后一个问题。尽管“
    ”的使用错误,但我看到像 Chrome 这样的浏览器可以正确解析代码。是否有可能使 libxml2 正确解析代码,例如,通过不同地指定 doctype ?我从不是我的服务器上获取 html 代码,所以我无法正确修改 html 代码..
  • 猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2018-10-22
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多