DOM文档:使用的nodeValue改变HTML内容产生错误格式的HTML文件( 代替 )

2019-10-20 13:01发布

我使用jQuery来让用户位置不同的div。 后来我倾倒他们通过jQuery的$。员额一个PHP POST功能,并将它们保存到外部HTML文件通过PHP。 这应该处理的书面PHP文件使用DOM文档(这是我从来没有used-我也没有任何XML规范的知识,如果有的话)。

在PHP文件内容如下:

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

这是非常简单的,它应该工作。 Howewer,而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片段解析未能保持因unproper格式(可能只是cosmeting,看到我基本上传递工作的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);

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

Answer 1:

是的, 的nodeValue将去掉标签。

你要创建一个片段中的数据,然后追加它 。

<?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。

输出 :

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


文章来源: DOMdocument: using nodeValue to change html content produces wrongly formatted html file (
instead of
)