DOMDocument::registerNodeClass

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DOMDocument::registerNodeClass注册用于创建基本节点类型的扩展类

描述

public DOMDocument::registerNodeClass(string $baseClass, ?string $extendedClass): bool

此方法允许您注册您自己的扩展 DOM 类,以便随后由 PHP DOM 扩展使用。

此方法不是 DOM 标准的一部分。

注意

注册的节点类的对象的构造函数不会被调用。

参数

baseClass

您要扩展的 DOM 类。您可以在章节介绍中找到这些类的列表。

extendedClass

您的扩展类名。如果提供 null,则将删除之前注册的任何扩展 baseClass 的类。

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 向 DOMElement 添加新方法以简化我们的代码

<?php

class myElement extends DOMElement {
function
appendElement($name) {
return
$this->appendChild(new myElement($name));
}
}

class
myDocument extends DOMDocument {
function
setRoot($name) {
return
$this->appendChild(new myElement($name));
}
}

$doc = new myDocument();
$doc->registerNodeClass('DOMElement', 'myElement');

// 从现在开始,向另一个元素添加元素只需要一次方法调用!
$root = $doc->setRoot('root');
$child = $root->appendElement('child');
$child->setAttribute('foo', 'bar');

echo
$doc->saveXML();

?>

上面的示例将输出

<?xml version="1.0"?>
<root><child foo="bar"/></root>

示例 #2 检索作为自定义类的元素

<?php
class myElement extends DOMElement {
public function
__toString() {
return
$this->nodeValue;
}
}

$doc = new DOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");
$doc->registerNodeClass("DOMElement", "myElement");

$element = $doc->getElementsByTagName("child")->item(0);
var_dump(get_class($element));

// 并利用 __toString 方法..
echo $element;
?>

上面的示例将输出

string(9) "myElement"
text in child

示例 #3 检索拥有文档

当实例化自定义 DOMDocument 时,ownerDocument 属性将引用实例化的类。但是,如果对该类的所有引用都被删除,它将被销毁,并且将创建新的 DOMDocument。出于这个原因,您可能需要使用 DOMDocument::registerNodeClass() 以及 DOMDocument

<?php
class MyDOMDocument extends DOMDocument {
}

class
MyOtherDOMDocument extends DOMDocument {
}

// 使用一些 XML 创建 MyDOMDocument
$doc = new MyDOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");

$child = $doc->getElementsByTagName("child")->item(0);

// 节点的当前拥有者是 MyDOMDocument
var_dump(get_class($child->ownerDocument));
// MyDOMDocument 被销毁
unset($doc);
// 并且创建了新的 DOMDocument 实例
var_dump(get_class($child->ownerDocument));

// 从 MyDOMDocument 导入节点
$newdoc = new MyOtherDOMDocument;
$child = $newdoc->importNode($child);

// 注册自定义 DOMDocument
$newdoc->registerNodeClass("DOMDocument", "MyOtherDOMDocument");

var_dump(get_class($child->ownerDocument));
unset(
$doc);
// 创建了新的 MyOtherDOMDocument
var_dump(get_class($child->ownerDocument));
?>

上面的示例将输出

string(13) "MyDOMDocument"
string(11) "DOMDocument"
string(18) "MyOtherDOMDocument"
string(18) "MyOtherDOMDocument"

示例 #4 自定义对象是短暂的

注意

注册的节点类的对象是短暂的,也就是说,当它们不再从 PHP 代码中引用时,它们会被销毁,并且在再次检索时会被重新创建。这意味着自定义属性值在重新创建后将丢失。

<?php
class MyDOMElement extends DOMElement
{
public
$myProp = '默认值';
}

$doc = new DOMDocument();
$doc->registerNodeClass('DOMElement', 'MyDOMElement');

$node = $doc->createElement('a');
$node->myProp = '修改后的值';
$doc->appendChild($node);

echo
$doc->childNodes[0]->myProp, PHP_EOL;
unset(
$node);
echo
$doc->childNodes[0]->myProp, PHP_EOL;
?>

上面的示例将输出

modified value
default value

添加说明

用户贡献笔记 2 个笔记

crh3675 at gmail dot com
14 年前
创建 innerHTML 和 outerHTML

<?php

class DOMHTMLElement extends DOMElement
{
function
__construct() { parent::__construct();}

public function
innerHTML()
{
$doc = new DOMDocument();
foreach (
$this->childNodes as $child){
$doc->appendChild($doc->importNode($child, true));
}
$content = $doc->saveHTML();
return
$content;
}

public function
outerHTML()
{
$doc = new DOMDocument();
$doc->appendChild($doc->importNode($this, true));
$content = $doc->saveHTML();
return
$content;
}
}

$dom = DOMDocument::loadHTMLFile($file);
$dom->registerNodeClass('DOMElement','DOMHTMLElement');

if(
$dom)
{
$xpath = new DOMXpath($dom);
$regions = $xpath->query("//*[contains(@class, 'editable')]");
$content = '';

foreach(
$regions as $region){
$content .= $region->outerHTML();
}

return
$content;

}else{
throw new
Exception('无法解析 HTML。请验证语法是否正确。');
}
?>
arnold at adaniels dot nl
15 年前
请注意,save 和 saveXML 不受 __toString() 的影响。
To Top