我正在使用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">
</class= "dummydata">
</div>
</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('<', '<', $content);
$content = str_replace('>', '>', $content);
file_put_contents($file_path, $content);
它不是很优雅,但它有效。有什么想法吗?你认为这样一个hacky解决方案可能是合理的,而不是试图正确格式化我作为XML传递的HTML?什么是可能的陷阱?我想不出任何一个,看到我只是克隆格式错误但工作的HTML。提前谢谢。
答案 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替换为代码。
<!DOCTYPE html>
<html><body><div id="container"><div class="dummydata"></div></div></body></html>