略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: DOMNode::appendChild

2024-11-14

DOMNode::appendChild

(PHP 5, PHP 7, PHP 8)

DOMNode::appendChild Adds new child at the end of the children

说明

public DOMNode::appendChild(DOMNode $node): DOMNode|false

This function appends a child to an existing list of children or creates a new list of children. The child can be created with e.g. DOMDocument::createElement(), DOMDocument::createTextNode() etc. or simply by using any other node.

When using an existing node it will be moved.

参数

node

The appended child.

返回值

The node added.

错误/异常

DOM_NO_MODIFICATION_ALLOWED_ERR

Raised if this node is readonly or if the previous parent of the node being inserted is readonly.

DOM_HIERARCHY_REQUEST_ERR

Raised if this node is of a type that does not allow children of the type of the node node, or if the node to append is one of this node's ancestors or this node itself.

DOM_WRONG_DOCUMENT_ERR

Raised if node was created from a different document than the one that created this node.

范例

The following example will add a new element node to a fresh document.

示例 #1 Adding a child

<?php

$doc 
= new DOMDocument;

$node $doc->createElement("para");
$newnode $doc->appendChild($node);

echo 
$doc->saveXML();
?>

示例 #2 Nested children

<?php

$doc 
= new DOMDocument;

$headNode $doc->createElement("head");
$doc->appendChild($headNode);

$titleNode $doc->createElement("title");
$headNode->appendChild($titleNode);

echo 
$doc->saveXML();
?>

参见

add a noteadd a note

User Contributed Notes 4 notes

up
19
krisdover at hotmail dot com
14 years ago
What's not mentioned here is that DOMNode::appendChild() can also be used to move an existing node to another part of the DOMDocument, e.g.

<?php
$doc
= new DOMDocument();
$doc->loadXML("<foobar><bar/><foo/></foobar>");
$bar = $doc->documentElement->firstChild;
$foo = $doc->documentElement->lastChild;
$foo->appendChild($bar);
print
$doc->saveXML();
?>

This produces:

<?xml version="1.0"?>
<foobar><foo><bar/></foo></foobar>

Note that the nodes "<foo/>" and "<bar/>" were siblings, i.e. the first and last child of "<foobar>" but using appendChild() we were able to move "<bar/>" so that it is a child of "<foo/>".

This saves you the trouble of doing a DOMNode::removeChild($bar) to remove "<bar/>" before appending it as a child of "<foo/>".

Kris Dover
up
7
cweiske at php dot net
4 years ago
If you want to move the children of one node to another, you cannot simply iterate on $element->childNodes - you have to make an array first:

<?php
$children
= [];
foreach (
$elemWithChildren->childNodes as $child) {
   
$children[] = $child;
}
foreach (
$children as $child) {
   
$targetElement->appendChild($child);
}
?>
up
6
jrtayloriv at gmail dot com
14 years ago
If you want to create nested DOM elements:

<?php
    $doc
= new DOMDocument();
   
   
$foo = $doc->createElement("foo");
   
$doc->appendChild($foo);

   
$bar = $doc->createElement("bar");
   
$foo->appendChild($bar);

   
$bazz = $doc->createElement("bazz");
   
$foo->appendChild($bazz);

    echo
$doc->saveXML();
?>

Is equivalent to:

<foo>
  <bar></bar>
  <bazz></bazz>
</foo>
up
2
frame at dynamiccreated dot de
11 years ago
Aware dealing with DOMNodeList and appendChild() on the same Node.

If you want to replace only the children not the DOMElement itself you probably foreach childNodes-property or get the DOMElements with a for-loop and item()-method of the DOMNodeList.

You will fail if you not clone the received single DOMElement. Actually the count of the DOMNodelist will be decreased on appendChild count but appendChild seems to refer to the old Nodelist and nothing visible will happen. Cloning will help.

官方地址:https://www.php.net/manual/en/domnode.appendchild.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3