Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

dnes nový podtitulek!

DOMDocument::registerNodeClass je boží

A teď jedna dobrá zpráva ze světa zpracování XML dokumentů v PHP. S příchodem verze 5.2.0 se řady funkcí DOM rozšířily o nováčka jménem registerNodeClass(). K čemu však slouží? Dokumentace to úzkostlivě tají, dokonce i strýček Google cudně mlčí. Tak to se asi nedozvíme. Nejspíš půjde o nějakou hloupost…

The end

Ještě tu jste?

Tak to, ukecali jste mě, prozradím vám význam registerNodeClass. Tato funkce bezpochyby přináší svěží vítr do celé problematiky XML a nastavuje zrcadlo dosavadnímu systému zpracování. Možná více než slova napoví malý příklad.

Jednotlivé třídy DOM je možné v PHP dále rozšiřovat. Například takto si rozšíříme DOMElement o tři šikovné metody:

class dgxElement extends DOMElement
{

    /**
     * Converts to a SimpleXMLElement
     */
    public function toSimple()
    {
        return simplexml_import_dom($this);
    }


    /**
     * Removes this element from the document
     */
    public function remove()
    {
        $this->parentNode->removeChild($this);
    }

    /**
     * Kills all the children. But kindly!
     */
    public function childless($node)
    {
        $this->nodeValue = '';
    }

}

První z nich přetaví uzel na objekt SimpleXML, druhá jej zase odstraní ze stromu dokumentu. A třetí funkce je tuze šikovná, protože zbaví element všech potomků a to vskutku elegantně, bez složitých iterací.

Tohle všechno je velmi krásné, skoro až báječné, nebýt jednoho drobného detailu. Výhod dgxElement využijeme pouze tehdy, pokud element vytvoříme skriptem. V případě, že XML dokument naparsujeme ze souboru, tak bude tvořen pouze standardními objekty DOMElement, DOMAttr, atd.

Této vady na kráse si všimli i američtí inženýři. Po krátké poradě se rozhodli jednat a brzy přišli s řešením. Dali mu politicky korektní název registerNodeClass. A nyní opět pohovořme v jazyce PHP:

$doc = new DOMDocument();

// and now use dgxElement instead of DOMElement!
$doc->registerNodeClass('DOMElement', 'dgxElement');

// parse a XML file
$doc->loadXML('<root><blog name="La Trine"/></root>');

// returns TRUE
echo ($doc->documentElement instanceof dgxElement);

// method toSimple() test:
$simple = $doc->documentElement->toSimple();

foreach ($simple as $blog)
    echo $blog['name'];


// bye bye element <blog>
$doc->documentElement->firstChild->remove();

echo $doc->saveXML(); //  <root/>

Paráda, ne?

Karma body: 20. Líbil se vám článek?

Komentáře » přidat

  1. avatar [1] d.f.h: nový

    paráda, jo! :-) s XML pracuju často a rád, tohle se bude určitě hodit. díky za dokumentaci.

    Posláno 9. 11. 2006 v 9.14 | Odpovědět
  2. avatar [2] johno: nový

    To vyzerá ako keby objavili Factory pattern. Design patterns v PHP extension? Neverím vlastným očiam.

    Posláno 9. 11. 2006 v 10.34 | Odpovědět
    Na komentář reagoval [7] pete
    Na komentář reagoval [9] Robajz
  3. [3] ehmo: nový

    hned to pomohlo, konecne sa moze ten hnusny import xmlcka prepisat, radost pozerat :)

    Posláno 9. 11. 2006 v 10.53 | Odpovědět
    Na komentář reagoval [9] Robajz
  4. [4] lukas: nový

    Nejak mi nedochazi, proc to PHP 5 vubec pouzivat. Asi tak jedina vyjimecna vlastnost PHP je, ze je (temer) vsude a kazdy s nim (jakz takz) umi. Jenze to plati pro PHP 4 a ne pro PHP 5 (a taky to pro nej nikdy platit nebude, jedina sance by byla dobre zvladnuta propagace PHP 6 spojena se zazrakem).

    Je mi jasny, ze je porad lepsi sporna kompatibilita skriptu PHP 4 ⇒ PHP 5 nez zadna kompatibilita PHP 4 ⇒ uplne_jiny_jazyk, ale presto – podporuje uz konecne PHP 5 unicode (nechce se mi verit, ze by nativni podporu nemelo, ale i presto, ze Googluju jak o zavod, tak nic nevidim)? A dokazu udelat PHP neco elegantneji nez Python?

    Posláno 9. 11. 2006 ve 12.20 | Odpovědět
    Na komentář reagoval [6] Ronnie
  5. avatar [5] Jan Tichý: nový

    Tahle funkce je fajn, i když její uvedení nepovažuji až za takový nečekaný zázrak, jak by mohlo vyznít z nadšeného článku. Je to spíš jen logické vyústění něčeho, co tu mělo být už dávno. Vždyť podobných override možností už na různých jiných místech PHPčka existuje celá řada – od definice vlastních funkcí pro obsluhu sessions počínaje až třeba po předefinování vracené Statement třídy u PDO konče.

    Posláno 9. 11. 2006 ve 14.00 | Odpovědět
  6. [6] Ronnie: nový

    [4] lukas: Mně zas nedochází, proč se v každé diskusi musí rozpotávat flame PHP vs. ostatní jazyky.

    Posláno 9. 11. 2006 ve 14.17 | Odpovědět
  7. [7] pete: nový

    [2] johno: Mě spíš překvapuje že to do DOMDocument-u šoupli až teď, když simplexml to má už delší dobu (simplexml_lo­ad_string($in­put, ‚XML_Node‘))

    Posláno 11. 11. 2006 v 19.47 | Odpovědět
  8. avatar [8] Zdeněk Košťál: nový

    Stejně nejkrásnější je, jak se u takovýchto příspěvků vždy zredukuje počet komentářů, protože tomu nikdo nerozumí :-D

    Posláno 13. 11. 2006 ve 22.13 | Odpovědět
  9. [9] Robajz: nový

    Vážně super :)

    [3] ehmo: Psal jsem kdysi třídu pro import XML, která rozšiřovala DOMDocument a to že nešlo vynutit vlastní třídy pro nody byla fakt bolest. [2] johno: Factory asi objevili, ale bylo by fine, kdyby člověk měl k dispozici i tu factory funkci.

    class DOMDocument // jak by to mohlo byt
    {
        public function registerNodeFactory($factoryCallback);
    }
    class DOMDocumentMyImport extends DOMDocument
    {
        public function __construct($version=null , $encoding=null )
        {
            parent::__construct($version , $encoding);
            $this->registerNodeFactory(array($this,'factoryNode'));
        }
        protected function factoryNode(DOMNode $originNode /*nebo co?*/)
        {
             // return new node...
        }
    }
    Posláno 22. 11. 2006 v 10.46 | Odpovědět

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

La Trine © 2004, 2008 David Grudl – o webu
provozuje Pachollini.

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.