Импорт одного DOMDocument в другой - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь объединить 2 HTML-документа, A и B. В основном следует интегрировать 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 объект, поскольку он является подклассом DOMNode в PHP, который функция importNode () требует в качестве аргумента.( importNode () , DOMDocument )

Я уже рассматривал некоторые подобные вопросы, но не смог найти ничего, что помогло бы мне вэта ситуация.

1 Ответ

0 голосов
/ 24 января 2019

Вы пытаетесь использовать 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();

с .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() аналог.

...