DOMDocument::registerNodeClass

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

DOMDocument::registerNodeClassRegistra la classe estesa utilizzata per creare il tipo di nodo di base

Descrizione

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

Questo metodo consente di registrare la propria classe DOM estesa da utilizzare in seguito dall'estensione DOM di PHP.

Questo metodo non fa parte dello standard DOM.

Elenco dei parametri

baseclass

La classe DOM che si desidera estendere. Si può trovare un elenco di queste classi nell'introduzione al capitolo.

extendedclass

Il nome della propria classe estesa. Se viene fornito null, qualsiasi classe registrata in precedenza che estende baseclass verrà rimossa.

Valori restituiti

Restituisce true in caso di successo, false in caso di fallimento.

Esempi

Example #1 Aggiunta di un nuovo metodo a DOMElement per semplificare il codice

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

// D'ora in poi, aggiungere un elemento ad un altro costa solo una chiamata al metodo !
$root $doc->setRoot('root');
$child $root->appendElement('child');
$child->setAttribute('foo''bar');

echo 
$doc->saveXML();

?>

Il precedente esempio visualizzerà:

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

Example #2 Recupero di elementi come classe personalizzata

<?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 approfitta del metodo __toString..
echo $element;
?>

Il precedente esempio visualizzerà:

string(9) "myElement"
text in child

Example #3 Recupero del proprietario del documento

Quando si crea un'istanza di un DOMDocument personalizzato, la proprietà ownerDocument farà riferimento alla classe istanziata, il che significa che non è necessario (e in realtà non è possibile) utilizzare DOMDocument::registerNodeClass() con DOMDocument

<?php
class myDOMDocument extends DOMDocument {
}

class 
myOtherDOMDocument extends DOMDocument {
}

// Crea myDOMDocument con un po' di XML
$doc = new myDOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");

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

// L'attuale proprietario del nodo è myDOMDocument
var_dump(get_class($child->ownerDocument));

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

// Il nuovo proprietario del nodo è cambiato in myOtherDOMDocument
var_dump(get_class($child->ownerDocument));
?>

Il precedente esempio visualizzerà:

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

add a note add a note

User Contributed Notes 2 notes

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