DOMDocument::registerNodeClass

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

DOMDocument::registerNodeClassRegistra una clase extendida usada para crear tipos de nodos base

Descripción

publicDOMDocument::registerNodeClass(string$baseclass, string$extendedclass): bool

Este método permite registrar su propia clase DOM extendida para usarla después por la extensión DOM de PHP.

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

Parámetros

baseclass

La clase DOM que se quiere extender. Se puede encontrar una lista de estas clases en el capítulo introducción.

extendedclass

El nombre de la clase extendida. Si se proporciona null, cualquier clase registrada previamente que extienda baseclass será eliminada.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Historial de cambios

VersiónDescripción
5.2.2 Antes de 5.2.2, una extendedclass previamente registrada teniá que ser desregistrada antes de poder registrar una nueva clase que extendiese a la misma baseclass.

Ejemplos

Ejemplo #1 Añadir un nuevo método a DOMElement para facilitar su 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 ahora, ¡ añadir un elemento a otro sólo cuesta una llamada al método !
$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 Recuperar elementos como clase 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));

// Y tomar ventaja del método __toString ...
echo $element;
?>

El resultado del ejemplo sería:

string(9) "myElement" text in child

Ejemplo #3 Recuperar un propio documento

Al instanciar un DOMDocument personalizado, la propiedad ownerDocument se referirá a la clase instanciada, lo que significa que no hay necesidad (y de hecho no es posible) de usar DOMDocument::registerNodeClass() con DOMDocument

<?php
class myDOMDocument extends DOMDocument {
}

class
myOtherDOMDocument extends DOMDocument {
}

// Crear myDOMDocument con algo de XML
$doc = new myDOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");

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

// El actual propietario del nodo es myDOMDocument
var_dump(get_class($child->ownerDocument));

// Importar un nodo desde myDOMDocument
$newdoc = new myOtherDOMDocument;
$child = $newdoc->importNode($child);

// El propietario del nodo ha cambiado a myOtherDOMDocument
var_dump(get_class($child->ownerDocument));
?>

El resultado del ejemplo sería:

string(13) "myDOMDocument" string(18) "myOtherDOMDocument"
To Top