DOMDocument::registerNodeClass

(PHP 5 >= 5.2.0, PHP 7)

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

Описание

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

add a note add a note

User Contributed Notes 2 notes

up
1
crh3675 at gmail dot com
8 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
8 years ago
Note than save and saveXML are not affected by __toString().
To Top