DOMDocument::registerNodeClass
(PHP 5 >= 5.2.0, PHP 7)
DOMDocument::registerNodeClass — Регистрация расширенного класса, используемого для создания базового типа узлов
Описание
$baseclass
, string $extendedclass
)Этот метод позволяет зарегистрировать свой собственный расширенный DOM класс, чтобы впоследствии использовать его в PHP DOM расширении.
Этот метод не входит в стандарт DOM.
Список параметров
-
baseclass
-
DOM класс, который будет расширен. Список таких классов можно увидеть во введении.
-
extendedclass
-
Имя расширенного класса. Если передать
NULL
, будут удалены все ранее зарегистрированные классы, расширяющие данный базовый классbaseclass
.
Возвращаемые значения
Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки.
Список изменений
Версия | Описание |
---|---|
5.2.2 |
В версиях до 5.2.2 ранее зарегистрированный расширенный класс
extendedclass должен быть исключен из регистрации,
прежде чем регистрировать новый класс, расширяющий тот же базовый класс
baseclass .
|
Примеры
Пример #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::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
$newdoc = new myOtherDOMDocument;
$child = $newdoc->importNode($child);
// Новый владелец узла изменился на myOtherDOMDocument
var_dump(get_class($child->ownerDocument));
?>
Результат выполнения данного примера:
string(13) "myDOMDocument" string(18) "myOtherDOMDocument"
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Обработка XML
- Document Object Model
- Функция DOMDocument::__construct() - Создание нового DOMDocument объекта
- Функция DOMDocument::createAttribute() - Создает новый атрибут
- Функция DOMDocument::createAttributeNS() - Создает новый узел-атрибут с соответствующим ему пространством имен
- Функция DOMDocument::createCDATASection() - Создает новый cdata узел
- Функция DOMDocument::createComment() - Создает новый узел-комментарий
- Функция DOMDocument::createDocumentFragment() - Создание фрагмента докуента
- Функция DOMDocument::createElement() - Создает новый узел-элемент
- Функция DOMDocument::createElementNS() - Создание нового узла-элемента с соответствующим пространством имен
- Функция DOMDocument::createEntityReference() - Создание нового узла-ссылки на сущность
- Функция DOMDocument::createProcessingInstruction() - Создает новый PI-узел
- Функция DOMDocument::createTextNode() - Создает новый текстовый узел
- Функция DOMDocument::getElementById() - Ищет элемент с заданным id
- Функция DOMDocument::getElementsByTagName() - Ищет все элементы с заданным локальным именем
- Функция DOMDocument::getElementsByTagNameNS() - Ищет элементы с заданным именем в определенном пространстве имен
- Функция DOMDocument::importNode() - Импорт узла в текущий документ
- Функция DOMDocument::load() - Загрузка XML из файла
- Функция DOMDocument::loadHTML() - Загрузка HTML из строки
- Функция DOMDocument::loadHTMLFile() - Загрузка HTML из файла
- Функция DOMDocument::loadXML() - Загрузка XML из строки
- Функция DOMDocument::normalizeDocument() - Нормализует документ
- Функция DOMDocument::registerNodeClass() - Регистрация расширенного класса, используемого для создания базового типа узлов
- Функция DOMDocument::relaxNGValidate() - Производит проверку документа на правильность построения посредством relaxNG
- Функция DOMDocument::relaxNGValidateSource() - Проверяет документ посредством relaxNG
- Функция DOMDocument::save() - Сохраняет XML дерево из внутреннего представления в файл
- DOMDocument::saveHTML
- DOMDocument::saveHTMLFile
- Функция DOMDocument::saveXML() - Сохраняет XML дерево из внутреннего представления в виде строки
- Функция DOMDocument::schemaValidate() - Проверяет действительности документа, основываясь на заданной схеме
- Функция DOMDocument::schemaValidateSource() - Проверяет действительность документа, основываясь на схеме
- Функция DOMDocument::validate() - Проверяет документ на соответствие его DTD
- Функция DOMDocument::xinclude() - Проводит вставку XInclude разделов в объектах DOMDocument
Коментарии
Note than save and saveXML are not affected by __toString().
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.');
}
?>