为什么PHP的DOMDocument会从Processing Instruction节点中删除前导空格? (<! - ?php? - >)

时间:2017-03-28 23:43:08

标签: php domdocument libxml2

我正在将符合XML的PHP​​文件加载到DOMDocument中。

    $domDoc = new DOMDocument();
    $domDoc->recover            = TRUE;
    $domDoc->preserveWhiteSpace = TRUE;
    $domDoc->formatOutput       = FALSE;
    $domDoc->substituteEntities = FALSE;
    $domDoc->resolveExternals   = FALSE;

尽管保留了空格并指示它不对输出进行格式化,但我仍然发现在使用<?php ?>保存XML时$domDoc->saveXML()块中的前导空格已被删除。

输入:

<?xml version="1.0" encoding="UTF-8"?>
<html>
<?php

// This is code.

// Something else.
    echo 'test';

?>
</html>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<html>
<?php // This is code.

// Something else.
    echo 'test';

?>
</html>

我希望输出尽可能与输入完全相同。折叠属性之间的空白是可以接受的,但是在节点之间或处理指令内折叠空格是不可行的。为什么PHP :: DOMDocument()/ libxml2会更改PI的内容?我是否需要使用手动DOM回显来保持完全保留的空白?

1 个答案:

答案 0 :(得分:2)

PI节点中的领先空白实际上可以崩溃,因为the DOM considers the data portion of a processing instruction to be

  

此处理指令的内容。这是从目标之后的第一个非空格字符到紧接在?&gt;之前的字符。

(强调我的。)

preserveWhiteSpace设置仅适用于文本节点,这就是为什么这对您没有帮助。

在任何情况下,我都建议不要依赖嵌入式PHP作为处理指令,因为PHP中可以包含?>(例如作为字符串文字的一部分),它会提前终止处理指令。 / p>