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?
Komentáře
» přidat
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.

#1 d.f.h http://moznosti.cz nový
paráda, jo!
s XML pracuju často a rád,
tohle se bude určitě hodit. díky za dokumentaci.
#2 johno http://johno.jsmf.net/ nový
To vyzerá ako keby objavili Factory pattern. Design patterns v PHP extension? Neverím vlastným očiam.
#3 ehmo nový
hned to pomohlo, konecne sa moze ten hnusny import xmlcka prepisat, radost pozerat :)
#4 lukas http://www.pro-vlasy.cz/ 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?
#5 Jan Tichý http://www.jantichy.cz 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.
#6 Ronnie nový
#4 lukas: Mně zas nedochází, proč se v každé diskusi musí rozpotávat flame PHP vs. ostatní jazyky.
#7 pete http://pmatous.net/ nový
#2 johno: Mě spíš překvapuje že to do DOMDocument-u šoupli až teď, když simplexml to má už delší dobu (simplexml_load_string($input, ‚XML_Node‘))
#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í
#9 Robajz http://robajz.info 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.