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(
    bool $exclusive = false,
    bool $withComments = false,
    ?array $xpath = null,
    ?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
    string $uri,
    bool $exclusive = false,
    bool $withComments = false,
    ?array $xpath = null,
    ?array $nsPrefixes = null
): int|false
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
}

属性

childElementCount

子元素数量。

firstElementChild

第一个子元素或 null

lastElementChild

最后一个子元素或 null

变更日志

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

目录

添加笔记

用户贡献笔记 3 个笔记

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

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
11
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) {
}
1
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