libxml2无法正确处理HTML中的CDATA

K J*_*K J 5 html xml html-parsing libxml2

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

和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>
Run Code Online (Sandbox Code Playgroud)

解析器错误地将引号内的</ div>识别为真正的html标记,并打印出错误消息,如下所示:

:8: HTML parser error : Unexpected end tag : script
    </script>
             ^
:9: HTML parser error : Unexpected end tag : div
  </div>
        ^

打印出来的结果和调试也意味着解析出错了:

<!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[ 
    //<![CDATA[
      document.write(']]></script></div>');
    //]]>


</body></html>

所以问题是,这是libxml2的错误吗?或者我做错了什么?
任何有见地的建议将不胜感激.谢谢!

Que*_*tin 3

在 HTML 中,该<script>元素根据定义包含 CDATA,因此<![CDATA[无效。

简而言之,源文件已损坏。

该部分更合适地写为:

<script type="text/javascript"> 
  document.write('<\/div>');
</script>
Run Code Online (Sandbox Code Playgroud)