Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

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 najkomplikova­nejš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.


 

Všetky články v sekcii
Práca so súbormi v PHP
Preskočiť článok
(neodporúčame)
Práca s textovými súbormi v PHP
Článok pre vás napísal Kit
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Jsem spokojeným uživatelem operačních systémů založených na linuxovém jádře. Zejména openSUSE a Ubuntu. Pro psaní veškerých textů a programů používám vynikající textový editor Vim. Aplikace se snažím psát vždy v tom nejvhodnějším programovacím jazyk...
Aktivity