PHP: Generování XML metodou SAX

PHP Práce se soubory PHP: Generování XML metodou SAX

Nechal jsem se inspirovat článkem Úvod do XML a zápis SAXem a napsal jsem podobnou aplikaci v PHP. Použil jsem i stejná vstupní data.

$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)));

Pro generování XML metodou SAX je možné použít třídu XMLWriter.

$out = new XMLWriter();
$out->openMemory();
$out->startDocument('1.0','UTF-8');
$out->setIndent(TRUE);
$uzivatele->exportXML($out);
$out->endDocument();
echo $out->outputMemory(TRUE);

Nejzajímavější metodou bude asi exportXML() objektu $uzivatele. Ostatní příkazy nastavují parametry výstupu.

Třída Uzivatele má jen 2 metody: Pro přidání dalšího uživatele a pro 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();
  }
}

Třída Uzivatel obsahuje 3 atributy, dle zvážení si můžete přidat další.

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šimněte si, že jmeno je přidáno jako element, ale vek jen jako atribut. V reálu by bylo výhodnější použít místo věku roku narození, ale chtěl jsem, aby datová struktura byla podobná jako v odkazovaném článku.

Privátní objekt $registrovan má datum uloženo ve 3 číslech. Je to jen ukázka, jak pracovat s vnořenými objekty. V reálu bych celé datum uložil jako 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še. Po spuštění skriptu jsem obdržel následující výsledek:

<?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 rychlou a paměťově nenáročnou metodou, jak přímo vygenerovat dokument XML nebo XHTML. Pokud však budete chtít výstup dále zpracovávat šablonovacím systémem, bude výhodnější použití DOM, se kterým šablonovací systémy přímo pracují.

Ještě varování: Vstupní data pro třídu XMLWriter musí být v kódování UTF-8. Jinak nebude fungovat správně česky. Výstupní kódování je možné zvolit dle potřeby.


 

  Aktivity (1)

Článek pro vás napsal Kit
Avatar
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...

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Předchozí článek
PHP: Čtení XML metodou SAX
Miniatura
Všechny články v sekci
Práce se soubory v PHP
Miniatura
Následující článek
PHP: Čtení XML třídou SimpleXML

 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

To předávání instance XmlWriteru do uživatele za účelem jeho zápisu mne nenapadlo, hezky řešené :)

Jak bys řešil čtení? Měl jsem problém s privátními atributy, vyřešil jsem to pomocnými proměnnými.

Odpovědět 17.8.2012 15:36
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Právě to mi na tom příkladu v C# chybělo. Proto jsem toho využil a napsal to v PHP. Každá třída se stará jen o své privátní proměnné, nemusel jsem řešit gettery ani settery.

Čtení se pokusím slepit dnes, nejprve si přečtu tvůj článek. Asi tam udělám továrničku.

Odpovědět 17.8.2012 17:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Podívej se i na to CSV, tam mám tu obj. strukturu.

Odpovědět 17.8.2012 18:12
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Zrovna zkouším čtení XML v PHP metodou SAX. Není to žádná sranda. Načtení do DOMu je mnohem pohodlnější a možná i rychlejší. Pokud by zdrojové XML bylo menší než desítky MB, určitě bych raději použil DOM.

Čtení metodou SAX bych doporučil masochistům a uživatelům zpracovávajícím tak velké soubory XML, že se nevejdou do paměti. Ostatní ať raději použijí DOM.

Odpovědět 17.8.2012 20:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.