将一个 DOMDocument 导入另一个
Importing one DOMDocument into another
我正在尝试合并 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)
我已经查看了一些类似的问题,但没能找到任何可以帮助我解决这种情况的问题。
您正在尝试使用 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()
对应的文档结构相比,它对文档结构的宽容度要低得多。
我正在尝试合并 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)
我已经查看了一些类似的问题,但没能找到任何可以帮助我解决这种情况的问题。
您正在尝试使用 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()
对应的文档结构相比,它对文档结构的宽容度要低得多。