libxml2 не может правильно обрабатывать CDATA в HTML - PullRequest
5 голосов
/ 26 декабря 2010

Я использую libxml2.2.7.3 для разбора html-страниц, и у меня возникают трудности с его корректной работой с CDATA в HTML. Вот код:

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 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? Или я что-то не так делаю?
Любые проницательные советы будут с благодарностью. Спасибо!

1 Ответ

3 голосов
/ 26 декабря 2010

В HTML элемент <script> по определению содержит CDATA, поэтому <![CDATA[ не имеет никакого эффекта.

Короче говоря, исходный документ поврежден.

Этот раздел будет более правильно записан как:

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