将一个DOMDocument导入另一个

时间:2019-01-24 10:28:20

标签: php dom domdocument php-7

我正在尝试合并2个html文档A和B。A应该基本上集成B。 考虑以下代码:

$domA = new DOMDocument();
$domA->loadHTMLFile('foo/bar/A.html');

$domB = new DOMDocument();
$domB->loadHTMLFile('foo/bar/B.html');

$elementToReplace = /*some element in $domA*/;

$domA->importNode($domB, true); /*<-- error occuring here: Node Type Not Supported*/
$domA->replaceChild($domB, $elementToReplace);

我真的不明白为什么importNode不能在DOMDocument对象上工作,因为它是PHP中DOMNode的子类,而importNode()函数需要将其作为参数。 (importNode()DOMDocument

我已经在研究一些类似的问题,但是在这种情况下找不到任何可以帮助我的东西。

1 个答案:

答案 0 :(得分:1)

您正在尝试使用DOMDocument $domB作为导入节点,而需要导入内容-$domB->documentElement是根元素。

有关如何使用它的快速示例(带有注释)...

$domA = new DOMDocument();
$domA->loadHTMLFile('a.html');
$domB = new DOMDocument();
$domB->loadHTMLFile('b.html');

// Find the point to replace with new content
$elementToReplace = $domA->getElementById("InsertHere");

// Import the base of the new document as $newNode
$newNode = $domA->importNode($domB->documentElement, true);
// Using the element to replace, move up a level and replace
$elementToReplace->parentNode->replaceChild($newNode, $elementToReplace);
echo $domA->saveHTML();

带有a.html ...

<html>
<head></head>
<body>
  <div id="InsertHere" />
</body>
</html>

和b.html

<div>New content to insert</div>

会给...

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head></head><body>
  <html><body><div>New content to insert</div></body></html>
</body></html>

请注意,当您使用loadHTMLFile()时,它甚至将HTML的一小部分都包装到了整页中。相反,如果您使用...

$domB->load('b.html');

结果是...

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head></head><body>
  <div>New content to insert</div>
</body></html>

请注意,尽管使用load()会加载XML,并且与loadHTML()相比,对文档结构的容忍度要低得多。