PHP 8.4.1 Released!

DOMDocument::registerNodeClass

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

DOMDocument::registerNodeClassRegistra uma classe estendida usada para criar um tipo de nó base

Descrição

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

Este método permite registrar uma classe DOM estendida própria para ser usada posteriormente pela extensão PHP DOM.

Este método não faz parte do padrão DOM.

Cuidado

O construtor dos objetos das classes de nó registradas não é chamado.

Parâmetros

baseClass

A classe DOM a ser estendida. Pode-se encontrar uma lista dessas classes na introdução ao capítulo.

extendedClass

O nome da classe estendida. Se null for fornecido, qualquer classe previamente registrada estendendo baseClass será removida.

Valor Retornado

Sempre retorna true.

Registro de Alterações

Versão Descrição
8.4.0 DOMDocument::registerNodeClass() agora tem um tipo de retorno provisório de true.

Exemplos

Exemplo #1 Adicionando um novo método a DOMElement para facilitar nosso código

<?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');

// A partir de agora, adicionar um elemento a outro custa apenas uma chamada de método!
$root = $doc->setRoot('root');
$child = $root->appendElement('child');
$child->setAttribute('foo', 'bar');

echo
$doc->saveXML();

?>

O exemplo acima produzirá:

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

Exemplo #2 Recuperando elementos como uma classe personalizada

<?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));

// E aproveite o método __toString..
echo $element;
?>

O exemplo acima produzirá:

string(9) "myElement"
text in child

Exemplo #3 Recuperando o documento proprietário

Ao instanciar um DOMDocument personalizado, a propriedade ownerDocument se referirá à classe instanciada. No entanto, se todas as referências a essa classe forem removidas, ela será destruída e um novo DOMDocument será criado. Por esse motivo, pode-se usar DOMDocument::registerNodeClass() com DOMDocument

<?php
class MyDOMDocument extends DOMDocument {
}

class
MyOtherDOMDocument extends DOMDocument {
}

// Crie MyDOMDocument com algum XML
$doc = new MyDOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");

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

// O proprietário atual do nó é MyDOMDocument
var_dump(get_class($child->ownerDocument));
// MyDOMDocument é destruído
unset($doc);
// E uma nova instância DOMDocument é criada
var_dump(get_class($child->ownerDocument));

// Importe um nó de MyDOMDocument
$newdoc = new MyOtherDOMDocument;
$child = $newdoc->importNode($child);

// Registre DOMDocument personalizado
$newdoc->registerNodeClass("DOMDocument", "MyOtherDOMDocument");

var_dump(get_class($child->ownerDocument));
unset(
$doc);
// Nova instância MyOtherDOMDocument é criada
var_dump(get_class($child->ownerDocument));
?>

O exemplo acima produzirá:

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

Exemplo #4 Objetos personalizados são transitórios

Cuidado

Objetos das classes de nó registradas são transitórios, ou seja, eles são destruídos quando não são mais referenciados pelo código PHP e recriados ao serem recuperados novamente. Isso implica que os valores das propriedades personalizadas serão perdidos após a recriação.

<?php
class MyDOMElement extends DOMElement
{
public
$myProp = 'default value';
}

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

$node = $doc->createElement('a');
$node->myProp = 'modified value';
$doc->appendChild($node);

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

O exemplo acima produzirá:

modified value
default value

adicione uma nota

Notas Enviadas por Usuários (em inglês) 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