downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

DOMDocument::relaxNGValidate> <DOMDocument::normalizeDocument
Last updated: Fri, 20 May 2011

view this page in

DOMDocument::registerNodeClass

(PHP 5 >= 5.2.0)

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

Descripción

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

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ón Descripción
PHP 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

Example #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>

Example #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

Example #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"



add a note add a note User Contributed Notes DOMDocument::registerNodeClass
crh3675 at gmail dot com 26-Sep-2009 03:23
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.');
}
?>
arnold at adaniels dot nl 22-Jul-2009 10:10
Note than save and saveXML are not affected by __toString().

 
show source | credits | stats | sitemap | contact | advertising | mirror sites