如果nodeValue只包含一个空格而不包含其他内容,该怎么办


What to do if nodeValue contains only a space and nothing more

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