Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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í/in­dentaci). 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 81x (3.65 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
Práce se soubory CSV v PHP
Všechny články v sekci
Soubory a práce s nimi v PHP
Přeskočit článek
(nedoporučujeme)
Práce se soubory XML v PHP - Čtení
Článek pro vás napsal Kit
Avatar
Uživatelské hodnocení:
12 hlasů
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