PHP: Čítanie XML metódou SAX
Opäť som sa nechal inšpirovať článkom http://www.itnetwork.cz/...ni-xml-saxem a napísal som podobnú aplikáciu v PHP. Opäť som použil rovnaké údaje.
<?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>
Tentoraz bola úloha oveľa ťažšie, ako generovanie XML metódou SAX. Je nutné čítať jednotlivé tokeny a ich postupnosťou riadiť ukladanie dát.
Záujemcom odporúčam metódu použiť iba v špecifických prípadoch, ak z obrovského dokumentu XML potrebujú len vybrať niektoré dáta. V ostatných prípadoch býva výhodnejšie použitie metódy DOM.
$data=new XMLreader(); $data->open('data.xml'); while($data->read()) { switch($data->name) { case 'uzivatele': $uzivatele=new Uzivatele($data); break;; } } echo $uzivatele,"\n";
Pozornejší programátori si všimli, že som vo switch
použil
len 1 × case
miesto kratšieho zápisu if
. Je to
preto, že pre čítanie používam metodiku regulárneho automatu, u ktorej je
použitie switch
obvyklé. Pri parsovanie zložitejšieho dokumente
iste oceníte jednoduchú rozšíriteľnosť.
class Uzivatele { private $seznam=array(); function __construct($data) { while($data->read()) { switch($data->name) { case 'uzivatel': if($data->nodeType==XMLReader::ELEMENT) { $this->seznam[]=new Uzivatel($data); } break;; case 'uzivatele': return; break;; } } } function __toString() { $out=array(); foreach($this->seznam as $uzivatel) { $out[]=$uzivatel->__toString(); } return implode("\n",$out); } }
Ani tu použitie switch
nevyzerá príliš vábne, pri použití
zložitejšie štruktúry XML však iste oceníte jednoduchosť pridanie
ďalších elementov.
class Uzivatel { private $jmeno; private $vek; private $registrovan; function __construct($data) { $this->vek=$data->getAttribute('vek'); while($data->read()) { switch($data->name) { case 'jmeno': $data->read(); $this->jmeno=$data->value; $data->read(); break;; case 'registrovan': $data->read(); $this->registrovan=$data->value; $data->read(); break;; case '#text': break;; default: return; } } } function __toString() { return sprintf("%-20s %2d %10s",$this->jmeno,$this->vek,$this->registrovan); } }
Nakoniec trieda Uzivatel
je najkomplikovanejšie. Najprv je
prečítaný atribút vek
elementu uzivatel
. Potom je
prečítaný aj obsah elementov jmeno
a registrovan
.
Ak parser narazí na neznámy element, je konštruktor ukončený. Pseudoelement
#text
obsahuje biele znaky, ktoré sú medzi elementy zdrojového
XML a ktorých sa potrebujeme zbaviť.
Metódy __toString()
sú určené na diagnostické výstupu. Po
spustení skriptu obdržíme nasledujúce výsledok:
Pavel Slavík 22 21.3.2000 Jan Novák 31 30.10.2012 Tomáš Marný 16 12.1.2011
Uvedený príklad nie je naprogramovaný úplne najčistejšie. Určite by sa našla kombinácia validných vstupných dát, ktorá by neprešla. Mala to byť len ukážka, že aj v PHP je možné použiť metódu SAX pre čítanie dokumentov XML.
V budúcej lekcii, Práca s textovými súbormi v PHP , si ukážeme, ako čítať a zapisovať (nielen) neštruktúrované textové súbory.