假设我需要将此HTML复制到一个变量(服务器端,因此是PHP)中:
<text>
<i>The text
<inserted> </inserted>
<inserted>has changed</inserted>
</i>
</text>
所以我使用这种代码:
$dom = new DOMDocument();
$dom->loadHTML($html); # HTML from above
foreach ($x->query("//text") as $node)
{
$the_html .= $node->C14N()
}
(DOMNode::C14N()
对我来说是一个超级发现)
所以,一切都很好,除了结果是这样的:
<text>
<i>The text
<inserted></inserted>
<inserted>has changed</inserted>
</i>
</text>
第一个<inserted>
内部的空间不见了!像这样调试:
echo 'damn' . $node->firstChild->firstChild->nodeValue . 'it';
还返回"damnit"。
有办法保护这个空间吗?(我尝试过DOMDocument::$preserveWhiteSpace
,但显然不是解决方案。)
或者这是不可能的,我应该改变我的方法?
事实证明:
- 您已使用
loadHTML()
加载此区块 - 空白区的HTML规则确实正确地应用了,从技术上讲,空白区"从未存在过"。从技术上讲,在那个地方用一个名为
<inserted>
的未定义标签对空间进行编码是不可能的。这将需要例如CCD_ 6 - 使用
loadXML()
可以保留空白
假设我需要将这个HTML复制到一个变量中(服务器端,因此是PHP):
好吧,让我们这样做:
$html = '<text>
<i>The text
<inserted> </inserted>
<inserted>has changed</inserted>
</i>
</text>';
所以我使用这样的代码:[…]所以,一切都很好,[原文如此!]除了结果是这样的:[…]
foreach($xpath->query("//text") as $node) {
echo $node->C14N();
}
给精确这个:
<text>
<i>The text
<inserted> </inserted>
<inserted>has changed</inserted>
</i>
</text>
因此,你的问题是关于一个不存在的问题。您没有指定一个具体的问题,也没有提供一个自包含的代码示例来演示您的问题。
不管preserveWhiteSpace标志如何,XML中似乎都忽略了所有空白,所以
<inserted> </inserted>
将始终为NULL。我在bytes网站上看到的唯一解决方案是将其标记为字符数据:
<inserted><![CDATA[ ]]></inserted>
在类似的事情上做到这一点:
foreach($x->query("//text") as $node) {
if ($node->nodeValue == '') {
$cdata = $node->ownerDocument->createCDATASection(' ');
$node->appendChild($cdata);
} else {
foreach($node->childNodes as $node) {
if ($node->nodeValue == '') {
$cdata = $node->ownerDocument->createCDATASection(' ');
$node->appendChild($cdata);
}
}
}