PHP: Generovanie XML metódou SAX
V predchádzajúcej lekcii, Úvod do práce so súbormi v PHP , sme si ujasnili, aké typy súborov existujú a ako pracovať s cestami k týmto súborom. V tejto lekcii sa pozrieme aj na to, ako pracovať s neštruktúrovaným obyčajným textom v jazyku PHP.
Nechal som sa inšpirovať článkom Úvod do XML a zápis Saxe a napísal som podobnú aplikáciu v PHP. Použil som aj rovnaké vstupné dáta.
$uzivatele=new Uzivatele(); $uzivatele->Add(new Uzivatel("Pavel Slavík", 22, new Datum(2000, 3, 21))); $uzivatele->Add(new Uzivatel("Jan Novák", 31, new Datum(2012, 10, 30))); $uzivatele->Add(new Uzivatel("Tomáš Marný", 16, new Datum(2011, 1, 12)));
Pre generovanie XML metódou SAX je možné použiť triedu
XMLWriter
.
$out = new XMLWriter(); $out->openMemory(); $out->startDocument('1.0','UTF-8'); $out->setIndent(TRUE); $uzivatele->exportXML($out); $out->endDocument(); echo $out->outputMemory(TRUE);
Najzaujímavejšie metódou bude asi exportXML()
objektu
$uzivatele
. Ostatné príkazy nastavujú parametre výstupu.
Trieda Užívateľ má len 2 metódy: Pre pridanie ďalšieho používateľa a pre export výsledného XML.
class Uzivatele { private $seznam=array(); function Add($uzivatel) { $this->seznam[]=$uzivatel; } function exportXML($out) { $out->startElement('uzivatele'); foreach($this->seznam as $uzivatel) { $uzivatel->exportXML($out); } $out->endElement(); } }
Trieda Uzivatel obsahuje 3 atribúty, podľa uváženia si môžete pridať ďalšie.
class Uzivatel { private $jmeno; private $vek; private $registrovan; function __construct($jmeno,$vek,$registrovan) { $this->jmeno=$jmeno; $this->vek=$vek; $this->registrovan=$registrovan; } function exportXML($out) { $out->startElement('uzivatel'); $out->writeAttribute('vek',$this->vek); $out->writeElement('jmeno',$this->jmeno); $this->registrovan->exportXML($out); $out->endElement(); } }
Všimnite si, že jmeno
je pridané ako element, ale
vek
len ako atribút. V reáli by bolo výhodnejšie použiť
namiesto veku roku narodenia, ale chcel som, aby dátová štruktúra bola
podobná ako v prepojenom článku.
Privátne objekt $registrovan
má dátum uložené v 3
číslach. Je to len ukážka, ako pracovať s vnorenými objektmi. V reáli by
som celý dátum uložil ako jednu hodnotu.
class Datum { private $den,$mesic,$rok; function __construct($rok,$mesic,$den) { $this->den=$den; $this->mesic=$mesic; $this->rok=$rok; } function exportXML($out) { $out->writeElement('registrovan',"$this->den.$this->mesic.$this->rok"); } }
A to je všetko. Po spustení skriptu som získal tieto výsledok:
<?xml version="1.0" encoding="UTF-8"?> <uzivatele> <uzivatel vek="22"> <jmeno>Pavel Slavík</jmeno> <registrovan>21.3.2000</registrovan> </uzivatel> <uzivatel vek="31"> <jmeno>Jan Novák</jmeno> <registrovan>30.10.2012</registrovan> </uzivatel> <uzivatel vek="16"> <jmeno>Tomáš Marný</jmeno> <registrovan>12.1.2011</registrovan> </uzivatel> </uzivatele>
SAX je rýchlou a pamäťovo nenáročnú metódou, ako priamo vygenerovať dokument XML alebo XHTML. Ak však budete chcieť výstup ďalej spracovávať šablonovacím systémom, bude výhodnejšie použitie DOM, s ktorým šablónovacích systémami priamo pracujú.
Ešte varovanie: Vstupné dáta pre triedu XMLWriter
musí byť
v kódovaní UTF-8
. Inak nebude fungovať správne po slovensky.
Výstupný kódovanie je možné zvoliť podľa potreby.
V nasledujúcom cvičení, Riešené úlohy k 1.-2. lekciu práca so súbormi v PHP, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.