DOMNode::insertBefore

(PHP 5, PHP 7, PHP 8)

DOMNode::insertBefore Añade un nuevo hijo antes de un nodo de referencia.

Descripción

public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false

Esta función inserta un nuevo nodo justo antes del nodo de referencia. Si se planea realizar modificaciones posteriores en el hijo añadido, debe utilizarse el nodo devuelto.

Al utilizar un nodo existente, este será movido.

Parámetros

node

El nuevo nodo.

child

El nodo referenciado. Si no se especifica, node será añadido a los hijos.

Valores devueltos

El nodo insertado o false en caso de error.

Errores/Excepciones

DOM_NO_MODIFICATION_ALLOWED_ERR

Lanzado si el nodo es de solo lectura o si el padre anterior al nodo a insertar es de solo lectura.

DOM_HIERARCHY_REQUEST_ERR

Lanzado si este nodo es de un tipo que no permite hijos del tipo del nodo node, o si el nodo a añadir es uno de los ancestros de este nodo o este nodo mismo.

DOM_WRONG_DOCUMENT_ERR

Lanzado si node ha sido creado desde un documento diferente al que ha creado este nodo.

DOM_NOT_FOUND_ERR

Lanzado si child no es un hijo de este nodo.

Ver también

add a note

User Contributed Notes 4 notes

up
18
Jerry Ellis
20 years ago
1st argument) a node to insert
2nd argument) a reference node - this is the node that the new node will be inserted before

The trick to using this method is that the OBJECT on which you actually CALL the insertBefore() method is actually the PARENT node of the reference node!

INCORRECT:
$DOMNode_refNode->insertBefore($DOMNode_newNode, $DOMNode_refNode);

CORRECT:
$DOMNode_refNode->parentNode->insertBefore($DOMNode_newNode, $DOMNode_refNode);
up
5
jarry1250 at gmail dot com
10 years ago
Note that supplying the same node for $newnode and $refnode leads to an E_WARNING ("Couldn't add newnode as the previous sibling of refnode"). For example imagine one wanted to make $newnode the first child of its parent by doing:

<?php
$firstSibling
= $newnode->parentNode->firstChild;
// Bad:
$newnode->parentNode->insertBefore( $newnode, $firstSibling );
?>

This would generate a warning if it already was the first child of its parent, since $newnode and $firstSibling are identical. Easy to work around though:

<?php
$firstSibling
= $newnode->parentNode->firstChild;
// Better:
if( $newnode !== $firstSibling ) {
$newnode->parentNode->insertBefore( $newnode, $firstSibling );
}
?>
up
8
jg at handcode dot de
19 years ago
example to insert <newnode/> between <chid1/> and <child2/>

<?xml version="1.0" encoding="ISO-8859-1" ?>
<root>
<parent>
<child nr="1"/>
<child nr="2"/>
</parent>
</root>

<?php

$xml_src
= 'test.xml';

// XPath-Querys
$parent_path = "//parent";
$next_path = "//parent/child[@nr='2']";

// Create a new DOM document
$dom = new DomDocument();
$dom->load($xml_src);

// Find the parent node
$xpath = new DomXPath($dom);

// Find parent node
$parent = $xpath->query($parent_path);

// new node will be inserted before this node
$next = $xpath->query($next_path);

// Create the new element
$element = $dom->createElement('newnode');

// Insert the new element
$parent->item(0)->insertBefore($element, $next->item(0));

echo
$dom->saveXML();

?>
up
-3
DrTebi at Yahoo
17 years ago
Sorry, my previous posting worked only for the top node. Here the corrected version, which will work for any node:

XML
----
<?xml version="1.0"?>
<contacts>
<person>Adam</person>
<person>Eva</person>
<person>Thomas</person>
</contacts>

PHP
---
<?php
// load XML, create XPath object
$xml = new DomDocument();
$xml->preserveWhitespace = false;
$xml->load('contacts.xml');
$xpath = new DOMXPath($xml);

// get node eva, which we will append to
$eva = $xpath->query('/contacts/person[.="Eva"]')->item(0);

// create node john
$john = $xml->createElement('person', 'John');

// insert john after eva
// "in eva's parent node (=contacts) insert
// john before eva's next node"
// this also works if eva would be the last node
$eva->parentNode->insertBefore($john, $eva->nextSibling);

// show result
header('Content-Type: text/plain');
print
$xml->saveXML();
?>

Result
------
<?xml version="1.0"?>
<contacts>
<person>Adam</person>
<person>Eva</person><person>John</person>
<person>Thomas</person>
</contacts>
To Top