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?