【问题标题】:Why does PHP's DOMDocument remove leading whitespace from Processing Instruction nodes? (<?php ?>)为什么 PHP 的 DOMDocument 会从处理指令节点中删除前导空格? (<?php ?>)
【发布时间】:2017-03-28 23:43:07
【问题描述】:

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

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

尽管保留了空格并指示它不格式化输出,但当我使用$domDoc-&gt;saveXML() 保存 XML 时,我仍然发现 &lt;?php ?&gt; 块中的前导空格被删除。

输入:

<?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 回显来保持空白完全保留?

【问题讨论】:

  • 嗨 Jimp,据我所知,它不是被删除的空格,而是换行符。您的文件中可能有两种类型的换行符(例如:“\n”与“\n\r”)。为什么不通过删除所有新行并在文本编辑器中重新应用它们并再次运行代码来编辑文件。
  • 感谢您的建议,但我已经尝试过了,没有任何区别。不幸的是,保罗在下面的回答是正确的。

标签: php domdocument libxml2


【解决方案1】:

PI 节点中的前导空白 实际上可以折叠,如 the DOM considers the data portion of a processing instruction to be

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

(强调我的。)

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

在任何情况下,我都建议不要将嵌入式 PHP 视为处理指令,因为 PHP 可以在其中包含 ?&gt;(例如,作为字符串文字的一部分),这会提前终止处理指令。

【讨论】:

  • 所以规范需要它...... XML 规范会在提供控制机制的情况下指定空白首选项,就好像指令处理器无法处理那个额外的空白一样,这真是太奇怪了。对我来说,问题是使用我的 UI 的编码员希望他们的代码原封不动,我无法区分内联 PHP 和作者从新行开始的大量代码块。我一直在查看 libxml2 源代码,但没有找到放松这种行为的选择。我想前后替换是我唯一的选择。
  • 另外,我刚刚尝试回显 PI 的 nodeValuetextContentdata 属性,并且所有三个都删除了前导空格。我希望至少 textContent 会有未更改的版本,但似乎 libxml2 正在使用 SAX 解析器并带有完全忽略它的指令(如规范所述)。
  • 哦,谢谢你关于不要在 XML 中嵌入 PHP 的建议。我确实遇到了您所描述的内容,但是由于该文档实际上是更大的 XML 文档结构的一部分,因此我必须应用一些规则来确保 PHP 始终与 XML 兼容。我可能会开始将 PHP PI 存储为带有转义 CDATA 文本的 节点,以便我可以删除此限制。
  • 我想到了涉及DOMNode::getLineNo() 的肮脏变通办法......但是伙计们,他们很脏。无论如何,对不起,我没有更好的消息告诉你。祝你好运。
猜你喜欢
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多