DOMDocument::importNode

(PHP 5, PHP 7, PHP 8)

DOMDocument::importNodeImport node into current document

Description

public DOMDocument::importNode(DOMNode $node, bool $deep = false): DOMNode|false

This function returns a copy of the node to import and associates it with the current document.

Parameters

node

The node to import.

deep

If set to true, this method will recursively import the subtree under the node.

Note:

To copy the nodes attributes deep needs to be set to true

Return Values

The copied node or false, if it cannot be copied.

Errors/Exceptions

DOMException is thrown if node cannot be imported.

Examples

Example #1 DOMDocument::importNode() example

Copying nodes between documents.

<?php

$orgdoc
= new DOMDocument;
$orgdoc->loadXML("<root><element><child>text in child</child></element></root>");

// The node we want to import to a new document
$node = $orgdoc->getElementsByTagName("element")->item(0);


// Create a new document
$newdoc = new DOMDocument;
$newdoc->formatOutput = true;

// Add some markup
$newdoc->loadXML("<root><someelement>text in some element</someelement></root>");

echo
"The 'new document' before copying nodes into it:\n";
echo
$newdoc->saveXML();

// Import the node, and all its children, to the document
$node = $newdoc->importNode($node, true);
// And then append it to the "<root>" node
$newdoc->documentElement->appendChild($node);

echo
"\nThe 'new document' after copying the nodes into it:\n";
echo
$newdoc->saveXML();
?>

The above example will output:

The 'new document' before copying nodes into it:
<?xml version="1.0"?>
<root>
  <someelement>text in some element</someelement>
</root>

The 'new document' after copying the nodes into it:
<?xml version="1.0"?>
<root>
  <someelement>text in some element</someelement>
  <element>
    <child>text in child</child>
  </element>
</root>

add a note

User Contributed Notes 2 notes

up
4
c dot 1 at smithies dot org
16 years ago
Assume that $source and $dest are instances of DOMDocument. Assume that $sourcedoc contains an element with ID 'sourceID' and that $destdoc contains an element with ID 'destID'. Assume that we have already set up source and destination element variables thus:

<?php
 $src = $sourcedoc->getElementById('sourceID');
 $dst = $destdoc->getElementById('destID');
?>

Finally, assume that $sel has more than one child node.

In order to import the child elements of $src as children of $dst, you might do something like this:

<?php
$src = $dest->importNode($src, TRUE);

foreach ($src->childNodes as $el) $dst->appendChild($el);
?>

But this does not work. foreach gets confused, because (as noted below) appending an imported element to another existing element in the same document causes it to be removed from its current parent element.

Therefore, the following technique should be used:

<?php
foreach ($src->childNodes as $el) $dst->appendChild($destdoc->importNode($el, TRUE));
?>
up
3
Fitopaldi
20 years ago
importNode returns a copy of the node to import and associates it with the current document, but not import the node to the current DOMDocument. Use appendChild for import the copy of the node to current DOMDocument.

<?
 $domNode = $dom->importNode($aDomNode, true);
 $currentDomDocument->appendChild($domNode);
?>
To Top