PHP nabízí široké možnosti práce s dokumenty XML a právě tomuto tématu se bude věnovat tento miniseriál. Už v tomto díle si vytvoříme PHP skript, který bude umět přečíst a zpracovat elementy a text.

XML je velice jednoduchý, přehledný a efektivní datový formát, který čím dál více nachází uplatnění nejen v podnikání a při výměně dat. Jednou z možností, jak zpracovávat data v XML dokumentu, je také použití parseru v PHP.

Vytvoření parseru

Nejprve vytvoříme XML parser pomocí funkce xml_parser_create. Její syntaxe je následující:

int xml_parser_create(string[kódování])

Pokud vše proběhne správně, vrátí funkce identifikátor. Při chybě vrací false. Co se týče kódování, jeho standardní hodnota je ISO-8859-1. Možné hodnoty jsou ale pouze ISO-8859-1 a UTF-8. Necháme tedy tento parametr nevyplněný a kódování určíme v XML dokumentu:

$parser=(xml_parser_create())

Obslužné funkce

Před zpracováním dokumentu musíme registrovat obsluhy těch prvků, které budeme chtít pomocí PHP zpracovávat. Pro zpracování prvku bude volána námi vytvořená obslužná funkce, která data od parseru zpracuje.

Obsluha elementů

Když parser v dokumentu narazí na nějaký tag (počáteční nebo koncový), zavolá registrovanou funkci a ta data z parseru zpracuje. Funkce pro obsluhu elementů registrujeme pomocí funkce xml_set_element_handler. Její syntaxe je následující:

int xml_set_element_handler(int parser, string pocatecnitag, string koncovytag)

Hodnota pocatecnitag je název funkce, která bude počáteční tag obsluhovat. Syntaxe funkce, která bude obsluhovat počáteční tag elementu je zde:

obsluhapocatecnihotagu(int parser, string jmenotagu, array atributy)

Pokud bude element obsahovat atributy, odešlou se jako pole s následující syntaxí:

array(„atribut1″=>“hodnota1“, „atribut2″=>“hodnota2“, „atribut3″=>“hodnota3“)

Hodnota koncovytag je název funkce, která bude obsluhovat koncový tag. Syntaxe funkce, která bude obsluhovat koncový tag elementu:

obsluhakoncovehotagu(int parser, string jmenotagu)

Celý mechanismus může vypadat například takto:

function obsluhapocatecnihotagu($parser, $nazev, $atributy) {
if(eregi(„tucne“, $nazev)) echo(„<b>“);
if(eregi(„lozene“, $nazev)) echo(„<i>“);
if(eregi(„podtrzene“, $nazev)) echo(„<u>“);
}
function obsluhakoncovehotagu($parser, $nazev) {
if(eregi(„tucne“, $nazev)) echo(„</b>“);
if(eregi(„lozene“, $nazev)) echo(„</i>“);
if(eregi(„podtrzene“, $nazev)) echo(„</u>“);
}
xml_set_element_handler($parser, „obsluhapocatecnihotagu“, „obsluhakoncovehotagu“);

Obsluha textu

Když parser narazí na znak obyčejného textu, zavolá pro jeho obsluhu funkci definovanou pomocí xml_set_character_data_handler. Syntaxe registrační funkce:

int xml_set_character_data_handler(int parser, string znaky)

Syntaxe funkce znaky je následující:

znaky(int parser, string data)

Veškeré znaky textu můžeme třeba rovnou vypisovat:

function znaky($parser, $data) {
echo($data);
}
xml_set_character_data_handler($parser, „znaky“);

Předávání dat parseru

Když už máme vytvořený parser a zaregistrované všechny potřebné obslužné funkce, zbývá nám už jen předat data parseru ke zpracování. K tomu slouží funkce xml_parse(). Její syntaxe:

int xml_parse(int parser, string data, int poslednipaket)

Nejprve otevřeme soubor data.xml:

if(!($soubor = fopen(„data.xml“))) {
die(„Nelze otevřít soubor data.xml!“);
} else {

A pak budeme předávat data parseru (třeba po 4096 bytech):

while ($d = fread($soubor, 4096)) {
 if(!xml_parse($parser, $d, feof($soubor))) {
  die(„Chyba XML“);
 }
}
}

Pokud dáme dohromady vše, co jsme si dnes vysvětlili, můžeme si vytvořit jednoduchý XML parser, který bude vypisovat všechen text, a vše mezi značkami <tucne> a </tucne> bude tučně, mezi <lozene> a </lozene> bude kurzívou a mezi <podtrzene> a </podtrzene> bude podtržené. Kompletní zdrojový kód naší aplikace:

<?php
$parser=(xml_parser_create());
function obsluhapocatecnihotagu($parser, $nazev, $atributy) {
if(eregi(„tucne“, $nazev)) echo(„<b>“);
if(eregi(„lozene“, $nazev)) echo(„<i>“);
if(eregi(„podtrzene“, $nazev)) echo(„<u>“);
}
function obsluhakoncovehotagu($parser, $nazev) {
if(eregi(„tucne“, $nazev)) echo(„</b>“);
if(eregi(„lozene“, $nazev)) echo(„</i>“);
if(eregi(„podtrzene“, $nazev)) echo(„</u>“);
}
xml_set_element_handler($parser, „obsluhapocatecnihotagu“, „obsluhakoncovehotagu“);
function znaky($parser, $data) {
echo($data);
}
xml_set_character_data_handler($parser, „znaky“);
if(!($soubor = fopen(„data.xml“, „r“))) {
die(„Nelze otevřít soubor data.xml!“);
} else {
while ($d = fread($soubor, 4096)) {
 if(!xml_parse($parser, $d, feof($soubor))) {
  die(„Chyba XML“);
 }
}
}
?>

A na závěr si samozřejmě ukážeme výsledek veškerého snažení. Použil jsem dokument XML, který po zpracování naším parserem vypadá takto.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

4 Příspěvků v diskuzi

  1. Prosím Vás tento článek je pro mé účely dostačující, ale nějak nechápu jak PHP zjistí, který xml soubor si má vzít.

    Děkuji za odpověď Niobi

Odpovědět