PHP 8.4.0 RC4 available for testing

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 {
}

// Создаём MyDOMDocument с некоторым XML-содержимым
$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;
?>

Результат выполнения приведённого примера:

изменённое значение
значение по умолчанию

Добавить

Примечания пользователей 2 notes

up
4
crh3675 at gmail dot com
15 years ago
Creating innerHTML and 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('Cannot parse HTML. Please verify the syntax is correct.');
}
?>
up
1
arnold at adaniels dot nl
15 years ago
Note than save and saveXML are not affected by __toString().
To Top