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';

'damnit' も返します。

スペースを確保する方法はありますか?(試してみましDOMDocument::$preserveWhiteSpaceたが、どうやら解決策ではありません。)

それとも不可能なので、アプローチを変更する必要がありますか?

4

2 に答える 2

1

次のことがわかります。

  • このloadHTML()チャンクをロードしていました。
  • ホワイトスペースの HTML ルールは正しく適用され、技術的にはスペースは「存在しませんでした」。その場所で名前が付けられた undefine タグを使用してスペースをエンコードすることは、技術的に不可能<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

preserveWhiteSpace フラグに関係なく、XML ではすべての空白が無視されるようです。

<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 に答える