DOMDocument::registerNodeClass

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

DOMDocument::registerNodeClass Регистрация расширенного класса, используемого для создания типа базового узла

Описание

public DOMDocument::registerNodeClass(string $baseClass, string|null $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::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"

Пример #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]->myPropPHP_EOL;
unset(
$node);
echo 
$doc->childNodes[0]->myPropPHP_EOL;
?>

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

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

add a note add a note

User Contributed Notes 2 notes

up
3
crh3675 at gmail dot com
14 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
0
arnold at adaniels dot nl
14 years ago
Note than save and saveXML are not affected by __toString().
To Top