Lekce 4 - Práce se soubory XML v PHP - Zápis
V předchozí lekci, Práce se soubory CSV v PHP, jsme se seznámili s prací se soubory pomocí tzv. resources, se soubory CSV a naše znalosti jsme využili v praktickém příkladu.
V této lekci se podíváme na práci s dalším formátem, který jsme si
představili v úvodní
lekci tohoto kurzu – XML. Ukážeme si, jak generovat XML metodou SAX,
čili třídou XMLWriter
.
Generování XML metodou
SAX – třída XMLWriter
Inspirujeme se článkem Úvod do XML a zápis SAXem z lekce o jazyce C# a napíšeme podobný skript v PHP. Použijeme i stejná vstupní data.
Třídy obsažené v XML
Nejprve si vytvoříme třídy, z kterých budeme generovat XML. Ty budeme
klasicky ukládat do složky /tridy
. Pro jednoduchost nebudeme
implementovat autoloader.
Třída Datum
Začneme třídou pro datum, které bude reprezentovat datum registrace:
class Datum { public function __construct(private int $rok, private int $mesic, private int $den) { // ticho } public function generateXML(XMLWriter $xml): void { $xml->writeElement('registrovan', "$this->den.$this->mesic.$this->rok"); } }
Třída bude obsahovat pouze konstruktor a metodu pro vygenerování XML,
respektive pouze elementu registrovan
. Ukládá datum ve třech
číslech. Je to jen ukázka, jak pracovat s vnořenými objekty. Celé datum
bychom jednodušeji uložili jako jednu hodnotu.
Třída Uzivatel
Dále vytvoříme třídu, která bude reprezentovat uživatele:
class Uzivatel { public function __construct(private string $jmeno, private int $vek, private Datum $registrovan) { // ticho } public function generateXML(XMLWriter $xml): void { $xml->startElement('uzivatel'); $xml->writeAttribute('vek', $this->vek); $xml->writeElement('jmeno', $this->jmeno); $this->registrovan->generateXML($xml); $xml->endElement(); } }
Metody budou opět dvě, do XML vypíšeme element uzivatel
a
ten bude mít atribut vek
(s hodnotou věku uživatele) a další
vnořený element jmeno
, který bude obsahovat jméno. V reálu by
bylo výhodnější použít místo věku rok narození, ale chtěl jsem, aby
datová struktura byla podobná, jako v odkazovaném článku.
Třída Uzivatele
Jako další a poslední třída bude Uzivatele
, ta bude mít
privátní atribut $seznam
, metodu add()
, která
přidá uživatele do seznamu a metodu generateXML()
, která
vygeneruje XML se všemi uživateli:
class Uzivatele { private array $seznam = array(); public function add(Uzivatel $uzivatel): void { $this->seznam[] = $uzivatel; } public function generateXML(XMLWriter $xml): void { $xml->startElement('uzivatele'); foreach ($this->seznam as $uzivatel) { $uzivatel->exportXML($xml); } $xml->endElement(); } }
Třídy bychom měli. Nyní si třídy naimportujeme pomocí funkce
require()
a nadefinujeme uživatele:
require('tridy/Datum.php'); require('tridy/Uzivatel.php'); require('tridy/Uzivatele.php'); $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 použijeme třídu
XMLWriter
:
$xml = new XMLWriter(); $xml->openMemory(); $xml->startDocument('1.0', 'UTF-8'); $xml->setIndent(true); $uzivatele->generateXML($xml); $xml->endDocument(); header("Content-Type: application/xml; charset=UTF-8"); echo($xml->outputMemory());
Nejzajímavější metodou je nejspíše generateXML()
objektu
$uzivatele
. Ostatní příkazy pouze nastavují parametry výstupu
(verzi a kódování XML, odsazování/indentaci). Nesmíme zapomenout na
funkci header()
, která nastaví hlavičku stránky tak, ať
vypíše XML dokument přímo do prohlížeče. Nakonec vypíšeme XML obsah
pomocí metody outputMemory()
na instanci naše XML instance.
To je vše. Po spuštění skriptu obdržíme 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 budeme chtít výstup dále zpracovávat šablonovacím systémem, bude výhodnější použít DOM, se kterým šablonovací systémy přímo pracují.
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.
V další lekci, Práce se soubory XML v PHP - Čtení, si ukážeme, jak číst ze souboru XML, pomocí
tříd XMLReader
a SimpleXML
.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 87x (3.65 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP