PHP Conference Japan 2024

DOMDocumentFragment 类

(PHP 5, PHP 7, PHP 8)

类概要

class DOMDocumentFragment extends DOMNode implements DOMParentNode {
/* 继承的常量 */
/* 属性 */
public readonly ?DOMElement $firstElementChild;
public readonly ?DOMElement $lastElementChild;
public readonly int $childElementCount;
/* 继承的属性 */
public readonly string $nodeName;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
/* 方法 */
public __construct()
public append(DOMNode|string ...$nodes): void
public appendXML(string $data): bool
public prepend(DOMNode|string ...$nodes): void
public replaceChildren(DOMNode|string ...$nodes): void
/* 继承的方法 */
public DOMNode::C14N(
    布尔型 $exclusive = false,
    布尔型 $withComments = false,
    ?数组 $xpath = null,
    ?数组 $nsPrefixes = null
): 字符串|false
public DOMNode::C14NFile(
    字符串 $uri,
    布尔型 $exclusive = false,
    布尔型 $withComments = false,
    ?数组 $xpath = null,
    ?数组 $nsPrefixes = null
): 整数|false
}

属性

childElementCount

子元素的数量。

firstElementChild

第一个子元素或null

lastElementChild

最后一个子元素或null

变更日志

版本 描述
8.0.0 添加了firstElementChildlastElementChildchildElementCount属性。
8.0.0 DOMDocumentFragment 现在实现了 DOMParentNode 接口。

目录

添加注释

用户贡献的注释 3 个注释

Ricki
13 年前
只有从父 DOMDocument 创建时,DOMDocumentFragment 才显得有用,例如:

1. $dom = new DOMDocument("1.0","UTF-8");
2. $docFrag = $dom->createDocumentFragment();
3. 现在将项目附加到 $docFrag
4. 将 $docFrag 内容移植回 $dom 的所需位置

相反,采用这种方法
1. $dom = new DOMDocument("1.0","UTF-8");
2. $docFrag = new DOMDocumentFragment();
3. 现在将项目附加到 $docFrag

...步骤 3 将因“只读”错误而失败,因为 $docFrag 不是作为 DOMDocument 的子项创建的。

我不确定这样做的原因:网上有人提到安全性问题,也有人提到设计缺陷,但无论原因是什么,当想要将通用的独立 DocumentFragment 封装到类中以便轻松移植到所需的树时,这确实非常限制性。我看到的唯一解决方法从性能角度来看代价很高,从编码角度来看很麻烦,例如,创建一个临时使用的虚拟 $dom。

(这在 PHP 5.3 中有效) 我把它放在这里是因为我浪费了很多时间才找到它——我希望这能节省其他人的时间。

使用新的 DOMDocumentFramt
matthijs at stdin dot nl
13 年前
请注意,当 DOMDocumentFragment 添加到另一个节点时,它有点特殊。发生这种情况时,不会将片段本身添加为子节点,而是将片段的所有子节点移动到新的父节点。

例如,考虑以下脚本

<?php

/* 创建一个包含单个节点的文档和片段 */
$doc = new DOMDocument();
$fragment = $doc->createDocumentFragment();
$fragment->appendChild($doc->createElement('foo'));

/* 现在,foo 节点是片段的子节点 */
var_dump($fragment->firstChild);

/* 将片段附加到另一个节点后,片段的子节点将被转移到该节点(并且片段不存在于子节点列表中!)*/
$doc->appendChild($fragment);
/* 所以片段不再有子节点了 */
var_dump($fragment->firstChild);
/* 但是 $doc 有一个子节点,它是 foo 元素,而不是片段 */
var_dump($doc->childNodes->length);
var_dump($doc->firstChild);

?>

这将产生以下输出

object(DOMElement)#3 (0) {
}
NULL
int(1)
object(DOMElement)#3 (0) {
}
peter at softcoded dot com
7 年前
DOMDocumentFragment 简化了节点的添加(或替换)操作。
使用DOM方法逐个创建节点可能会很繁琐。更好的方法如下:
例如,可以这样做

/**
* 创建colgroup片段
* @param DOMDocument $doc DOMDocument对象
* @return DOMDocumentFragment
*/
function makeFragment($d){
$chunk = <<<HTML
<colgroup>
<col class="c1"/>
<col class="c2"/>
<col class="c3"/>
<col class="c4"/>
</colgroup>
HTML;
$fragment = $d->createDocumentFragment();
$fragment->appendXML($chunk);
return $fragment;
}
To Top