PHP Conference Japan 2024

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 条注释

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

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

错误的
$DOMNode_refNode->insertBefore($DOMNode_newNode, $DOMNode_refNode);

正确的
$DOMNode_refNode->parentNode->insertBefore($DOMNode_newNode, $DOMNode_refNode);
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 );
}
?>
jg at handcode dot de
19 年前
在 <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();

?>
DrTebi at Yahoo
17 年前
抱歉,我之前的帖子仅适用于顶级节点。以下是更正后的版本,它将适用于任何节点

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');

// 在 eva 后插入 john
// “在 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>
justin at redwiredesign dot com
17 年前
前面的例子是不正确的,并且会导致 DOM_NOT_FOUND 错误,因为子节点不是根节点的直接后代。

因此,以下行

$parent_path = "/root";

需要更改为

$parent_path = "/root/parent";



$parent_path = "//parent";

才能使此示例正常工作
To Top