DOMdocument:使用nodeValue更改html内容会生成格式错误的html文件(&lt; div&gt;而非<div>)</div>

时间:2014-07-22 00:17:36

标签: php html domdocument

我正在使用jquery让用户定位各种div。之后我通过jquery的$ .post将它们转储到php POST函数,然后通过php将它们保存到外部html文件中。应该处理写入的.php文件使用DOMdocument(我从未使用过 - 我也不了解任何XML约定,如果有的话)。

.php文件读取:

<?php
$data = $_POST['data'];
$doc = new DOMDocument();
$doc->loadHTMLFile("startfile.html");
$doc->getElementById('container')->nodeValue = $data;
$doc->saveHTMLFile("endfile.html")
?>

这很简单,它应该有效。但是,endfile.html输出应该是:

<div id="container">
<div class= "dummydata">
</div>
</div>

它实际输出

<div id="container">
 &lt;/class= "dummydata"&gt;
 &lt;/div&gt;
</div>

浏览器当然无法正确解析。我确信我一直都错过了一些简单的东西,一旦解决方案出现在我眼前,我会觉得非常愚蠢。我不想诉诸fopen / fwrite,因为这似乎是处理html文件的一种非常优雅和灵活的方式。

编辑,因为建议的XML片段解析由于格式不正确而导致失败(可能只是考虑因素,因为我基本上都在传递HTML代码 - 可能是XML更为明智使用间距和字符? - 我选择了这个非常讨厌的解决方案:

//write HTML with nodevalue
$doc->getElementById('container')->nodeValue = $data;
$doc->saveHTMLFile("../test.html");
//open file and replace stripped < and >s
$file_path ='../test.html'
$content = file_get_contents($file_path);
$content = str_replace('&lt;', '<', $content);
$content = str_replace('&gt;', '>', $content);
file_put_contents($file_path, $content);

它不是很优雅,但它有效。有什么想法吗?你认为这样一个hacky解决方案可能是合理的,而不是试图正确格式化我作为XML传递的HTML?什么是可能的陷阱?我想不出任何一个,看到我只是克隆格式错误但工作的HTML。提前谢谢。

1 个答案:

答案 0 :(得分:2)

是的,nodeValue将删除标签。

您需要create a fragment数据,然后append it

<?php

$data = '<div class="dummydata"></div>';
$doc = new DOMDocument();
$doc->loadHTML('<!DOCTYPE html><div id="container">contents</div>');

$el = $doc->getElementById('container');

$children = $el->childNodes;
while ($children->length)
    $el->removeChild($children->item(0));

$frag = $el->ownerDocument->createDocumentFragment();
$frag->appendXML($data);
$el->appendChild($frag);

echo $doc->saveHTML();

如果要集成,请务必将loadHTML和saveHTML替换为代码。

Output

<!DOCTYPE html>
<html><body><div id="container"><div class="dummydata"></div></div></body></html>