1

假设我需要将此 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';

也返回“该死的”。

有没有办法保留空间?(我尝试过,DOMDocument::$preserveWhiteSpace但显然不是解决方案。)

还是不可能,我应该改变我的方法?

4

2 回答 2

1

结果是:

  • 你曾经loadHTML()加载过这个块。
  • 空白的 HTML 规则确实正确应用,并且从技术上讲,该空间“从未存在过”。从技术上讲,不可能在那个地方用一个未定义的标签对一个空间进行编码<inserted>。这将需要例如<pre>.
  • 使用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>

因此,您的问题询问了一个不存在的问题。您错过了指定具体问题并提供一个自包含的代码示例来演示您的问题。

于 2013-06-29T10:16:55.177 回答
0

似乎所有空格在 XML 中都被忽略了,不管 preserveWhiteSpace 标志,所以

<inserted> </inserted>

将始终为 NULL。我见过的唯一解决方案(在bytes.com)是将其标记为字符数据:

<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);
    }
  }
}
于 2013-06-28T13:31:57.767 回答