Číst soubory XML už umíme. Ale jak je zapisovat? Ukažme si na několik způsobů.
22.10.2004 15:00 | Petr Zajíc | přečteno 38098×
V předchozích dvou dílech seriálu jsme si ukázali, jak pomocí funkcí parseru číst hotové dokumenty XML. To se samozřejmě hodí v případě, kdy již máme nějaký ten XML soubor k dispozici. Co ale dělat v případě, kdy naopak bude chtít někdo XML soubor po nás?
Taková situace není nereálná. Jelikož, jak jsme uvedli, slouží XML převážně pro výměnu dat, může nějaký externí systém požadovat po naší aplikaci data v XML. Projděme si tedy několik způsobů, jak takovou úlohu splnit.
S tímto způsobem jsme se již seznámili v díle o exportu dat z MySQL. Jen připomenu, že se jednalo o přímý zápis dat a značky se dopisovaly do výstupního souboru (nebo do výstupního proudu) ručně. Tento způsob je pracný a zejména při vytváření složitěji strukturovaných XML dokumentů můžeme snadno udělat chybu. Jádro kódu pro export dat do XML vypadalo následovně:
<?
echo("<obce>\n");
while ($row = mysql_fetch_assoc ($vysledek))
{
echo ("\t<obec>\n");
echo ("\t\t<psc>\n");
echo "\t\t\t".$row["psc"]."\n";
echo ("\t\t</psc>\n");
echo ("\t\t<nazev>\n");
echo "\t\t\t".$row["obec"]."\n";
echo ("\t\t</nazev>\n");
echo ("\t</obec>\n");
}
echo("</obce>\n");
?>
Ruční způsob nedoporučuji. Povede nejspíš ke zmatkům; nemluvě o
situaci, kdy budeme potřebovat změnit strukturu exportovaného
dokumentu. Daleko lepší bude poohlédnout se po nějakém elegantnějším
řešení.
Jednou z mnoha možností je využít hotovou knihovnu serializer. Té stačí předat pole (nebo objekt) a seznam voleb, a vrátí hotový XML dokument. Nejprve to předveďme:
<?
//data
require("Serializer.php");
// zde je include souboru s
konstantami
mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
mysql_select_db(SQL_DBNAME);
$vysledek = mysql_query ("SELECT * FROM psc WHERE
psc=47001");
while ($row = mysql_fetch_array($vysledek))
$xml[] = array ( "nazev" => $row[0], "psc" => $row[1]);
//serializace
$options = array( "addDecl" => true, "defaultTagName"
=> "obec",
"linebreak" => "", "encoding" => "UTF-8", "rootName" => "obce");
$serializer = new XML_Serializer($options);
$serializer->serialize($xml);
// výstup
header("Content-Type: text/xml");
echo $serializer->getSerializedData();
?>
Poznamenejme rovnou, že tento způsob je daleko elegantnější než
ruční varianta. Rovněž stojí za zmínku, že v případě většiny exportů
(například, v případě exportu z jedné MySQL tabulky) bude vytvoření
pole poměrně triviální záležitost a tudíž celý kód nejenom dobře
poběží, ale bude rovněž hezky vypadat.
Pozn.: To je vidět na příkladu výše.
Povšimněme si, že zatímco funkce mysql_fetch_array vkládá každý řádek
do pole, funkce array vkládá toto pole ... (ano!) zase do pole. $xml je
jednorozměrné pole tvořené prvky, z nichž každý je rovněž jednorozměrné
pole. Komu se z toho točí hlava, může nahlédnout do dílu seriálu
o polích.
DOM, neboli Document Object Model je jiný mechanizmus pro čtení
(anebo zápis) XML dokumentů. Spočívá v tom, že se celý XML dokument
nejprve načte do paměti, tam se zanalyzuje a pak se k němu přistupuje
pomocí objektového modelu. To zní dobře. Podpora DOM je implementována
v mnoha programovacích jazycích, v PHP však není
tak dobrá, jak by mohla být. Pokud znáte mechanismus fungování DOM z
jiných programovacích jazyků, pravděpodobně po něm sáhnete i v PHP.
Měli byste ale mít na paměti následující věci:
Uvedené metody pochopitelně nejsou jediné způsoby, jak s pomocí PHP vytvářet XML dokumenty. Pokud máte jiný osvědčený způsob, můžete se s námi podlěit v diskusi. Každopádně, než se rozhodnete preferovat některou z variant, měli byste vzít v úvahu takové věci, jako je rychlost, čitelnost kódu, rozšiřitelnost a bezpečnost. Koneckonců, výsledek záleží na Vás.