DOMDocument::registerNodeClass

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

DOMDocument::registerNodeClassRegistra la clase extendida utilizada para crear un tipo de nodo base

Descripción

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

Este método permite registrar su propia clase DOM extendida para ser utilizada posteriormente en la extensión DOM de PHP.

Este método no forma parte del estándar DOM.

Precaución

Los constructores de los objetos de las clases de nodos registrados no son llamados.

Parámetros

baseClass

La clase DOM que se desea extender. Puede encontrarse una lista de estas clases en la introducción del capítulo.

extendedClass

El nombre de su clase extendida. Si se proporciona el valor null, todas las clases registradas previamente que extienden baseClass serán eliminadas.

Valores devueltos

Siempre devuelve true.

Historial de cambios

Versión Descripción
8.4.0 DOMDocument::registerNodeClass() ahora tiene un tipo de retorno provisional de tipo true.

Ejemplos

Ejemplo #1 Añadir un nuevo método a 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');

// A partir de aquí, la adición de un elemento a otro se realiza en una sola llamada !
$root = $doc->setRoot('root');
$child = $root->appendElement('child');
$child->setAttribute('foo', 'bar');

echo
$doc->saveXML();

?>

El resultado del ejemplo sería:

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

Ejemplo #2 Recuperación de elementos en forma de clase personalizada

<?php
class myElement extends DOMElement {
public function
__toString() {
return
$this->nodeValue;
}
}

$doc = new DOMDocument;
$doc->loadXML("<root><element><child>Texto en un hijo</child></element></root>");
$doc->registerNodeClass("DOMElement", "myElement");

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

// Y utilizamos las ventajas del método __toString..
echo $element;
?>

El resultado del ejemplo sería:

string(9) "myElement"
Texto en un hijo

Ejemplo #3 Recuperación del propietario del documento

Al instanciar un DOMDocument personalizado, la propiedad ownerDocument se refiere a la clase instanciada. Sin embargo, si todas las referencias a esta clase son eliminadas, será destruida y una nueva instancia de DOMDocument será creada en su lugar. Por esta razón, puede utilizarse el método DOMDocument::registerNodeClass() con DOMDocument

<?php
class MyDOMDocument extends DOMDocument {
}

class
MyOtherDOMDocument extends DOMDocument {
}

// Creación de un documento MyDOMDocument con algunos fragmentos XML
$doc = new MyDOMDocument;
$doc->loadXML("<root><element><child>texto en un hijo</child></element></root>");

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

// El propietario actual del nodo es MyDOMDocument
var_dump(get_class($child->ownerDocument));
// MyDOMDocument es destruido
unset($doc);
// Y una nueva instancia de DOMDocument es creada
var_dump(get_class($child->ownerDocument));

// Importación de un nodo desde MyDOMDocument
$newdoc = new MyOtherDOMDocument;
$child = $newdoc->importNode($child);

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

var_dump(get_class($child->ownerDocument));
unset(
$doc);
// Un nuevo MyOtherDOMDocument es creado
var_dump(get_class($child->ownerDocument));
?>

El resultado del ejemplo sería:

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

Ejemplo #4 Los objetos personalizados son efímeros

Precaución

Los objetos de la clase de nodos registrada son efímeros, es decir, son destruidos cuando ya no son referenciados desde el código PHP, y recreados cuando son recuperados nuevamente. Esto implica que los valores de propiedades personalizadas se perderán después de la recreación.

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

El resultado del ejemplo sería:

modified value
default value

add a note

User Contributed Notes 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
2
arnold at adaniels dot nl
15 years ago
Note than save and saveXML are not affected by __toString().
To Top