为什么libxml2引用了使用javascript在CDATA中开始双斜杠的原因

时间:2010-04-29 04:56:58

标签: php xml dom libxml2

这是我的代码:

<?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()) . '</pre>';

结果是:

<?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>

如果当我从XML文档中删除DOCTYPE表示法时,CDATA正常工作,并且前导/尾随双斜杠不会变为CDATA。

这是什么问题? libxml2中的错误? Linux上的PHP版本是5.2.13。感谢。

2 个答案:

答案 0 :(得分:1)

我在OS X上运行带有PHP 5.2.11的libxml 2.7.3。

不是苹果与苹果的比较,但也许它会帮助你。

当我运行你的代码时(在这里添加结束的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顺便说一下,所以我没有自己编译。)

希望这有助于指明您找到答案的方向。

小心!

答案 1 :(得分:0)

您应该使用API​​的HTML版本 请改用loadHTMLsaveHTML