DOMNode::insertBefore

(PHP 5, PHP 7, PHP 8)

DOMNode::insertBefore 在参考节点之前添加一个新子节点

描述

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

此函数在参考节点之前插入一个新节点。如果计划对附加的子节点进行进一步修改,则必须使用返回的节点。

使用现有节点时,它将被移动。

参数

node

新节点。

child

参考节点。如果未提供,则 node 将附加到子节点。

返回值

插入的节点或发生错误时为 false

错误/异常

DOM_NO_MODIFICATION_ALLOWED_ERR

如果此节点为只读或要插入的节点的先前父节点为只读,则引发此错误。

DOM_HIERARCHY_REQUEST_ERR

如果此节点的类型不允许 node 节点类型的子节点,或者要追加的节点是此节点的祖先之一或此节点本身,则引发此错误。

DOM_WRONG_DOCUMENT_ERR

如果 node 是从与创建此节点的文档不同的文档创建的,则引发此错误。

DOM_NOT_FOUND_ERR

如果 child 不是此节点的子节点,则引发此错误。

参见

添加注释

用户贡献注释 5 notes

16
Jerry Ellis
19 年前
第一个参数)要插入的节点
第二个参数)参考节点 - 这是新节点将在其之前插入的节点

使用此方法的技巧是,您实际调用 insertBefore() 方法的 OBJECT 实际上是参考节点的父节点!

不正确
$DOMNode_refNode->insertBefore($DOMNode_newNode, $DOMNode_refNode);

正确
$DOMNode_refNode->parentNode->insertBefore($DOMNode_newNode, $DOMNode_refNode);
5
jarry1250 at gmail dot com
9 年前
请注意,为 $newnode 和 $refnode 提供相同的节点会导致 E_WARNING(“无法将 newnode 添加为 refnode 的前一个兄弟节点”)。例如,假设想要通过以下操作使 $newnode 成为其父节点的第一个子节点

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

如果它已经是其父节点的第一个子节点,则这将生成警告,因为 $newnode 和 $firstSibling 是相同的。但很容易解决

<?php
$firstSibling
= $newnode->parentNode->firstChild;
// 更好:
if( $newnode !== $firstSibling ) {
$newnode->parentNode->insertBefore( $newnode, $firstSibling );
}
?>
8
jg at handcode dot de
18 年前
在 <chid1/> 和 <child2/> 之间插入 <newnode/> 的示例

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

<?php

$xml_src
= 'test.xml';

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

// 创建一个新的 DOM 文档
$dom = new DomDocument();
$dom->load($xml_src);

// 查找父节点
$xpath = new DomXPath($dom);

// 查找父节点
$parent = $xpath->query($parent_path);

// 新节点将在此节点之前插入
$next = $xpath->query($next_path);

// 创建新元素
$element = $dom->createElement('newnode');

// 插入新元素
$parent->item(0)->insertBefore($element, $next->item(0));

echo
$dom->saveXML();

?>
-3
DrTebi at Yahoo
16 年前
抱歉,我之前的帖子只适用于顶层节点。以下是经过修正的版本,适用于任何节点

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

PHP
---
<?php
// 加载 XML,创建 XPath 对象
$xml = new DomDocument();
$xml->preserveWhitespace = false;
$xml->load('contacts.xml');
$xpath = new DOMXPath($xml);

// 获取 eva 节点,我们将追加到该节点
$eva = $xpath->query('/contacts/person[.="Eva"]')->item(0);

// 创建 john 节点
$john = $xml->createElement('person', 'John');

// 将 john 插入 eva 之后
// “在 eva 的父节点(=contacts)中插入
// john 在 eva 的下一个节点之前”
// 这也适用于 eva 是最后一个节点的情况
$eva->parentNode->insertBefore($john, $eva->nextSibling);

// 显示结果
header('Content-Type: text/plain');
print
$xml->saveXML();
?>

结果
------
<?xml version="1.0"?>
<contacts>
<person>Adam</person>
<person>Eva</person><person>John</person>
<person>Thomas</person>
</contacts>
-5
justin at redwiredesign dot com
17 年前
之前的示例不正确,会导致 DOM_NOT_FOUND 错误,因为子节点不是根节点的直接后代。

因此,行

$parent_path = "/root";

需要更改为

$parent_path = "/root/parent";



$parent_path = "//parent";

为了使此示例能够正常工作
To Top