PHP Conference Japan 2024

DOMDocumentFragment 類別

(PHP 5, PHP 7, PHP 8)

類別概要

class DOMDocumentFragment extends DOMNode implements DOMParentNode {
/* 繼承的常數 */
/* 屬性 */
公開 唯讀 整數 $childElementCount;
/* 繼承的屬性 */
公開 唯讀 字串 $nodeName;
公開 唯讀 整數 $nodeType;
公開 唯讀 ?DOMNode $parentNode;
公開 唯讀 ?DOMElement $parentElement;
公開 唯讀 DOMNodeList $childNodes;
公開 唯讀 ?DOMNode $firstChild;
公開 唯讀 ?DOMNode $lastChild;
公開 唯讀 ?DOMNode $previousSibling;
公開 唯讀 ?DOMNode $nextSibling;
公開 唯讀 布林值 $isConnected;
公開 唯讀 ?DOMDocument $ownerDocument;
公開 唯讀 ?字串 $namespaceURI;
公開 字串 $prefix;
公開 唯讀 ?字串 $localName;
公開 唯讀 ?字串 $baseURI;
/* 方法 */
公開 __construct()
公開 append(DOMNode|字串 ...$nodes):
公開 appendXML(字串 $data): 布林值
公開 prepend(DOMNode|字串 ...$nodes):
公開 replaceChildren(DOMNode|字串 ...$nodes):
/* 繼承的方法 */
公開 DOMNode::C14N(
    布林值 $exclusive = false,
    布林值 $withComments = false,
    ?陣列 $xpath = null,
    ?陣列 $nsPrefixes = null
): 字串|false
公開 DOMNode::C14NFile(
    字串 $uri,
    布林值 $exclusive = false,
    布林值 $withComments = false,
    ?陣列 $xpath = null,
    ?陣列 $nsPrefixes = null
): 整數|false
公開方法 DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
公開方法 DOMNode::isDefaultNamespace(字串 $namespace): 布林值
公開方法 DOMNode::isEqualNode(?DOMNode $otherNode): 布林值
公開方法 DOMNode::isSameNode(DOMNode $otherNode): 布林值
公開方法 DOMNode::isSupported(字串 $feature, 字串 $version): 布林值
公開方法 DOMNode::lookupPrefix(字串 $namespace): ?字串
公開方法 DOMNode::normalize():
公開方法 DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
公開方法 DOMNode::__sleep(): 陣列
公開方法 DOMNode::__wakeup():
}

屬性

childElementCount (子元素數量)

子元素的數量。

firstElementChild

第一個子元素,或 null

lastElementChild

最後一個子元素,或 null

更新日誌

版本 說明
8.0.0 新增了 firstElementChildlastElementChildchildElementCount 屬性。
8.0.0 DOMDocumentFragment 現在實作了 DOMParentNode 介面。

目錄

新增註解

使用者貢獻的註解 3 則註解

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 的子項。

我不確定這樣做的原因:網路上有人說是基於安全性考量,也有人說是設計不良,但無論原因為何,當想要將通用的獨立 DocumentFragments 封裝到類別中以便輕鬆移植到所需的樹狀結構時,這真的會造成限制。我看過的唯一解決方法,從效能角度來看似乎很昂貴,從編碼角度來看也很麻煩,例如:建立一個虛擬的 $dom 供臨時使用。

(這在 PHP 5.3 中有效)我把它放在這裡是因為我花了很多時間才弄清楚 - 我希望這可以為其他人省去一些麻煩。

使用 new DOMDocumentFragment
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