почему в libxml2 начинается двойная косая черта в CDATA с использованием JavaScript - PullRequest
2 голосов
/ 29 апреля 2010

Это мой код:

<code><?php
$data = <<<EOL
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC
    "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <script type="text/javascript">
    //<![CDATA[
    var a = 123; // JS code
    //]]>
    </script>
</html>
EOL;

$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = false;
$dom->loadXml($data);
echo '<pre>' . htmlspecialchars($dom->saveXML()) . '
';

Это результат:

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<script type="text/javascript"><![CDATA[
//]]><![CDATA[
var a = 123; // JS code
//]]><![CDATA[
]]></script></html>

Если и когда я удаляю нотацию DOCTYPE из документа XML, CDATA работает правильно, а начальная / конечная двойная косая черта не превращается в CDATA.

В чем здесь проблема? Ошибка в libxml2? Версия PHP 5.2.13 для Linux. Спасибо.

Ответы [ 2 ]

1 голос
/ 29 апреля 2010

Я использую libxml 2.7.3 с PHP 5.2.11 в OS X.

Не сравнение яблок с яблоками, но, возможно, это поможет вам.

Когда я запускаю ваш код (и добавляю закрывающий тег PHP, вот мой вывод.)

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><script type="text/javascript">
    //<![CDATA[
    var a = 123; // JS code
    //]]>
    </script></html>

Похоже, что отображается правильно, как вы хотите. Возможно, номера версий помогут вам разобраться ... Я использую старую версию PHP5 (кстати, Mamp, поэтому я не скомпилировал ее сам).

Надеюсь, это поможет вам найти ответ.

Береги себя!

0 голосов
/ 01 января 2013

Вы должны использовать HTML-версию API.
Вместо этого используйте loadHTML и saveHTML.

...