XML

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání


XML je značkovací jazyk, podobný jazyku HTML. Na rozdiel od jazyka HTML, XML nemá presne definované značky, ktoré môže používať. Značky si tvorí používateľ sám. To zabezpečuje široké možnosti využitia tohto formátu. Jazyk XML bol primárne navrhnutý na ukladanie a prenos dát, zatiaľ čo HTML bol navrhnutý pre prezentáciu dát. O XML môžeme povedať nasledujúce tvrdenia:

  • XML je čistý text,
  • XML je skratka EXtensible Markup Language,
  • XML je značkovací jazyk podobne ako HTML,
  • XML slúži na uchovávanie dát, nie na zobrazovanie dát,
  • XML značky nie sú špecifikované. Používateľ si navrhuje značky podľa svojej potreby,
  • dokument XML by mal byť zostavený tak, aby bol samoopisný,
  • XML je odporúčanie W3C (na rozdiel od HTML, čo je štandard W3C),

XML značky

V jazyku XML je potrebné aby si používateľ definoval vlastné značky, pretože neexistujú preddefinované značky. Zoberme si príklad, keď si chceme vo formáte XML uložiť e-mailovú správu. V každej e-mailovej správe je odosielateľ, príjemca, nadpis správy s správa samotná. Pre tento formát navrhnime nasledujúcu kostru XML:

   <email> 
      <from> Alica </from>
      <to> Peter </to>
      <header> Pozdrav </header>
      <body> Ahoj Peter, posielam ti pozdrav. </body>
   </email>

V našom príklade sme si vytvorili značky <email>, <from>, <to>, <header> a <body>. Význam týchto značiek je zrejmý už z ich názvu.

Univerzálnosť XML

XML oddeľuje dáta od ich prezentácie. Nevýhodou HTML je fakt, že HTML obsahuje dáta a zároveň definuje spôsob, ako ich zobraziť. V tomto ohľade je tu veľmi silný vzťah medzi dátami a ich prezentáciou. S XML je možné obsah v prezentačnej vrstve (XML) dynamicky meniť podľa potreby (a povahy aplikácie). XML zjednodušuje zdieľanie informácií. Problém so vzájomným prepojením rôznych systémov je v rôznorodosti používaných formátov. S použitím XML sa situácia radikálne zjednodušuje, pretože XML je textový a otvorený formát. Výmena informácií medzi rôznymi systémami bežiacimi na rôznych platformách je potom oveľa jednoduchšia. Môže tu nastať problém so samotným formátom XML súboru. Ak rôzne systéme používajú rôzny formát XML súborov, potom sú stále nekompatibilné. Aj toto sa dá riešiť pomocou XML. S jazykom XML dokážeme opísať formát iného XML súboru. Takýmto prostriedkom je napr. jazyk SCHEMA, čo je opäť určitá forma XML, pomocou ktorej dokážeme definovať formát iným XML súborom.

Praktickým príkladom takejto spolupráce formátov XML je spôsob komunikácie webových služieb. V prípade webových služieb nie je presne špecifikované formát s akým bude komunikovať so svojím okolím (konzumenti webových služieb), resp. aplikácia webovej služby si špecifikuje formát sama. Aby bola dodržaná univerzálnosť komunikácie, existuje jazyk SOAP (opäť XML formát), ktorý hovorí aké časti sú v odosielanej správe. XML zjednodušuje zmenu platformy. Keďže XML je čistý text, nie je závislá na platforme na ktorej sa používa. Pojem platforma sa myslí v širšom slova zmysle. Jedná sa aj o hardvérovú platformu (Windows, Linux, Apple, ...) ale aj softvérovú platformu (php, Python, Java, C#, ...).

XML je základný jazyk pre tvorbu nových jazykov. Praxou sa ukázalo že značkovací jazyk je svojou povahou veľmi univerzálny. Preto je XML základom ďalších jazykov používaných v prostredí internetu. Môžeme spomenúť niektoré:

  • XHTML – nástupca jazyka HTML 4.01,
  • WSDL – jazyk pre opis dostupných webových služieb,
  • RSS – jazyk pre informačné kanály,
  • SVG – jazyk pre vektorovú grafiku,
  • XSLT – jazyk pre transformáciu jazyka XML,
  • SCHEMA – jazyk pre definovanie syntaxe jazyka XML,
  • XPATH – jazyk pre získavanie dát z XML súboru, a iné...

Pravidlá tvorby XML dokumentu

Pri tvorbe XML dokumentu musíme dodržiavať pravidlá syntaxe jazyka XML. Pozor, nemýľme si syntax jazyka, čo je pevne definované a formou XML dokumentu, čo tvoríme podľa svojich potrieb. Pravidlá syntaxe môžeme zhrnúť do niekoľkých bodov:

  • všetky XML elementy musia mať uzatváraciu značku,
  • v XML značkách rozhoduje veľkosť písmen,
  • XML elementy musia byť správne zahniezdené,
  • XML dokument musí mať práve jeden koreňový element,
  • Všetky XML atribútu musia byť uvedené v úvodzovkách,
  • Špeciálne znaky nemôžu byť použité ako obsah XML elementov,
  • V XML súbore sú zachované neviditeľné znaky (medzery, tabulátory, riadkovanie),
  • Všetky XML elementy musia mať uzatváraciu značku
  • Jazyk HTML dovoľuje použiť niektoré značky bez ukončovacej značky. Sú to napríklad <img>, <hr>, <br> a iné. V XML sa musí každá značka ukončiť ukončovacou značkou, ktorá je rovnaká ako otváracia značka ale začína znakom lomítka (/):
<from> Alica </from>
<to> Peter </to>

Značky, ktoré nemajú obsah môžeme uviesť v skrátenej forme, kedy neuvedieme ukončovaciu značku, ale zmodifikujeme začiatočnú značku. V nasledujúcom príklade sa jedná o ekvivalentný zápis:

<from></from>
<from/>

V XML značkách rozhoduje veľkosť písmen

Pri pomenovávaní značiek hrá úlohu veľkosť písmen. Jazyk XML je totiž case-sensitive, to znamená, že rozoznáva veľkosť písmen. V nasledujúcom zápise sa jedná o 2 rôzne značky:

<from>Alica</from>
<From>Alica</From>

XML elementy musia byť správne zahniezdené

Poradie písanie značiek je veľmi dôležité. Značky fungujú podobne ako zátvorky v matematických výrazoch. Vždy sa uzatvára najvnútornejší výraz ako prvý.

Ukážka nesprávneho ukončovania značiek

<email> 
<from> Alica </email>
</from>

Ukážka správneho ukončovania značiek

<email> 
<from> Alica </from>
</email>

XML dokument musí mať práve jeden koreňový element.

V XML súbore môže byť len jediný koreňový element (root element). Všetky ostatné elementy musia byť potomkami (obsahom) tohto elementu. XML atribúty

XML atribúty poskytujú dodatočné informácie pre dáta uložené v XML súbore. Všetky atribúty musia byť obklopené úvodzovkami:

<email priority="high"> 
<email priority='high'>

Obmedzenia pri použití atribútov

Nasledujúce fakty platia pri použití atribútov v XML elementoch. Tieto fakty ale neplatia pre použitie elementov:

  • Atribúty nemôžu obsahovať viacero hodnôt (ale element môže obsahovať viacero atribútov)
  • Atribúty nemôžu mať stromovú štruktúru,
  • Pri použití atribútov sa ťažšie modifikuje formát XML.

Špeciálne znaky nemôžu byť použité ako obsah XML elementov

V XML sú špeciálne znaky znamienka väčší (>), menší (<), ampersand (&), apostrof (') a úvodzovka ("). Ak chceme tieto znaky vložiť ako obsah XML elementu musíme použiť zástupné entity:

Špeciálny znak Zástupná entita
< &lt;
> &gt;
& &amp;
' '
" &quot;

XML element

XML element je všetko od začiatočnej XML značky až po konečnú značku vrátane. Zoberme si opäť náš príklad:

<mailbox> 
   <email priority="high"> 
      <from> Alica </from>
      <to> Peter </to>
      <header> Pozdrav </header>
      <body> Ahoj Peter, posielam ti pozdrav. </body>
   </email> 
   <email> 
      <from> Peter </from>
      <to> Alica </to>
      <header> Fw: Pozdrav </header>
      <body> Ahoj Alica, ďakujem za pozdrav. </body>
   </email> 
</mailbox>

V predchádzajúcom príklade obsahujú elementy <mailbox> a <email> ďalšie elementy – ich obsahom sú XML elementy. Element <from>, <to>, <header> a <body> obsahujú text. Prvý element <email> obsahuje atribút priority.

Pravidlá pomenovania XML elementov

  • Názvy elementov môžu obsahovať alfanumerické znaky,
  • Názov nesmie začínať číslom ani znamienkom (bodka, čiarka, dvojbodka, ....),
  • Názvy nesmú začínať znakmi xml (alebo XML, xML, XmL, ....),
  • Názvy nesmú obsahovať medzery.

Validácia XML dokumentu

O XML dokumente hovoríme, že je syntakticky správny ak je "dobre formátovaný" (well formed). Túto podmienku spĺňa XML dokument, v ktorom sú dodržané predchádzajúce pravidlá. Príklad kompletného XML dokumentu:

<?xml version="1.0" encoding="utf-8"?>
<mailbox> 
   <email priority="high"> 
      <from> Alica </from>
      <to> Peter </to>
      <header> Pozdrav </header>
      <body> Ahoj Peter, posielam ti pozdrav. </body>
   </email> 
   <email> 
      <from> Peter </from>
      <to> Alica </to>
      <header> Fw: Pozdrav </header>
      <body> Ahoj Alica, ďakujem za pozdrav. </body>
   </email> 
</mailbox>

Prvý riadok hovorí o tom, že sa jedná o XML súbor, vo verzii špecifikácie 1.0 a použité kódovanie je utf-8. Kódovanie uft-8 musí byť v tomto prípade použité ako znaková sada, a súbor musí byť uložený v tomto formáte.

Spracovanie XML dokumentu

XML dokument môžeme spracovať v jazyku JavaScrip i v jazyku PHP. Pre načítanie obsahu XML dokumentu použijeme model XML DOM, čo zabezpečuje rovnaký prístup k obsahu v rôznych programovacích jazykoch.

Načítanie XML súboru pomocou JavaScriptu

Všetky moderné web browsery majú vstavaný XML parser zabezpečujúci prácu s dokumentom XML. Bohužiaľ spôsob otvárania XML súboru je v Internet Exploreri (IE) iná ako vo všetkých ostatných web browserov. IE používa pre vytvorenie objektu XML knižnicu ActiveX, zatiaľ čo ostatné browsery (Firefox, Opera, Chrome) používajú štandardný objekt document. Vytvorenie prázdneho objektu potrebného na otvorenie XML súboru:

  1. var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  2. var mlDoc=document.implementation.createDocument("","",null);

Nasleduje nastavenie príznaku 'async' na false, čo zaručí, že ďalšia akcia sa bude robiť až po dokončení predchádzajúcej. Na koniec je samotné otvorenie a načítanie obsahu XML súboru:

xmlDoc.async="false";
xmlDoc.load("note.xml");

V nasledujúcom zdrojovom kóde je funkcia parseXML, ktorá zabezpečí otvorenie XML súboru. Pri vytváraní objektu xmlDoc sa berie ohľad na to, aký web browser je použitý. Konštrukcia try-catch nám zabezpečí chod skriptu aj keď sa nepodarí vytvoriť nový activeX objekt. V tomto prípade je to chyba, pri ktorej by inak skončilo vykonávanie skriptu.

function parseXML()
{ try //Internet Explorer
  {	xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
   }
  catch(e)
  { try //Firefox, Mozilla, Opera, etc.
	{
		xmlDoc=document.implementation.createDocument("","",null);
	}
	catch(e)
	{ 	alert(e.message);
		return;
	}
  }
  if(xmlDoc!=null)
 {  // praca s XML dokumentom
	xmlDoc.async=false;
	xmlDoc.load("note.xml");
 }
}

Pri otváraní XML súboru treba dať pozor na to, aby sa súbor nachádzal v adresárovej štruktúre, v ktorej je aj tento skript. Pri pokuse o otvorenie XML súboru z inej lokality (iný web server) bude metóda xmlDoc.load() genorovať chybu „Access denied“.

Čítanie obsahu XML súboru.

Pri otvorení XML súboru sa obsah súboru načíta do objektu xmlDoc a skontroluje sa jeho syntax v prípade chyby sa ďalšie spracovanie nevykonáva. Teda je vyžadované aby náš XML súbor neobsahoval žiadnu chybu. Vezmime si XML súbor z predchádzajúceho textu, kde máme koreňový element <mailbox>, ktorý obsahuje 2 emaly (elementy <email>). Úloha znie: zistiť odosielateľov daných emailov. Majme nasledujúci zápis:

   xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue

Výstupom bude: Alica


Vysvetlenie:

  • xmlDoc – objek XML dokumentu vytvoreného parserom
  • getElementsByTagName("from")[0] – prvý element <from>
  • childNodes[0] – prvý potomok alementu <from>. Poznamenajme, že element <from> neobsahuje text, ale obsahuje element textNode, ktorého obsahom je text „Alica“. Prvým (a jediným) potomkom elementu <from> je textNode.
  • nodeValue – hodnota textového elementu.

V prípade, že by sme chceli zistiť odosielateľa druhého emailu, zapíšeme to nasledovne:

   xmlDoc.getElementsByTagName("from")[1].childNodes[0].nodeValue


Úloha:

Zo súboru maily.xml (obsah súboru je výpis mailov z tejto kapitoly) načítajte a vypíšte všetky informácie v čitateľnej podobe. Riešenie:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body onload="parseXML()">
<script type="text/javascript">

function parseXML()
{
  try //Internet Explorer
  {	xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  }
  catch(e)
  { try //Firefox, Mozilla, Opera, etc.
	{
		xmlDoc=document.implementation.createDocument("","",null);
	}
	catch(e)
	{ 	alert(e.message);
		return;
	}
  }

  if(xmlDoc!=null)
  {  
	xmlDoc.async=false;
	xmlDoc.load("maily.xml");
	maily=xmlDoc.getElementsByTagName("email");	

	for(i=0;i<maily.length;i++){
		m=maily[i].childNodes;
		
		for(k=0;k<m.length;k++)
		{
			if(m[k].nodeType==1)
			{	
				document.write("<b>");
				document.write(m[k].nodeName)
				document.write("</b>: ")
				document.write(m[k].firstChild.nodeValue)
			}
			document.write("<br/>");
		}
	}
  }
}
</script>
</body>
</html>


Vysvetlenie ku kódu:

maily=xmlDoc.getElementsByTagName("email")
Zoznam elementov <email>. Využijeme ho pre prechádzanie jednotlivými položkami každého emailu.
m=maily[i].childNodes
Zoznam všetkých elementov, ktoré sú potomkami elementu <email>. Teda objek m pozostáva zo zoznamu (list) elemetnov <to>, <from>, <header> a <body>.
m[k].nodeType
Uzol XML dokumentu môže byť dokument, element, text, atribút, komentár, alebo iné. Pomocou atribútu nodeType zistíme o aký typ uzla ide. Nás zaujíma len typ Element. Uzol typu Element má hodnotu nodeType = 1.
m[k].nodeName
Vypíše názov elementu.
m[k].firstChild.nodeValue
Potomkom elementu je textový uzol (firstChild) a výraz nodeValue uchováva jeho obsah. Vypíše sa teda obsah elementu.

Výsledok:

from: Alica
to: Peter
header: Pozdrav
body: Ahoj Peter, posielam ti pozdrav. 

from: Peter
to: Alica
header: Fw: Pozdrav
body: Ahoj Alica, ďakujem za pozdrav.

Načítanie XML súboru pomocou php

Spracovanie XML súboru v jazyku PHP bude veľmi podobné so spracovaním v Javascripte, pretože model XML DOM je veľmi podobne spracovaný na rôznych platvormách. Majte teda rovnakú úlohu ako v predchádzajúcom príklade. Riešenie v jazyku PHP bude nasledovné:

<?php
	$src = new DOMDocument('1.0', 'utf-8');
	$src->formatOutput = true;
	$src->preserveWhiteSpace = false;
	$src->load('maily.xml');
	
	$maily = $src->getElementsByTagName('email');
	
	$i=0;
	for ($i = 0; $i < $maily->length; $i++) {
		$m=$maily->item($i)->childNodes;
		for($k=0;$k<$m->length;$k++)
		{
			if($m->item($k)->nodeType==1)
			{	
				echo("<b>");
				echo($m->item($k)->nodeName);
				echo("</b>: ");
				echo($m->item($k)->firstChild->nodeValue);
				echo "<br/>";
			}			
		}			
		echo  "<br/>";		
	}	
?>

Výsledok je rovnaký ako v predchádzajúcom príklade.


Jazyk PHP má od verzie 5 knižnicu simpleXML, pomocou ktorej sa dá s obsahom XNL súboru pracovať naozaj jednoducho. Vyriešme predchádzajúci príklad pomocou tejto knižnice.

	$xml = simplexml_load_file("maily.xml");
	for($k=0;$k<sizeof($xml->email);$k++){
		foreach($xml->email[$k] as $m){
			echo "<b>".$m->getName()."</b>: ";
			echo $m."<br/>"; 	
		}
		echo "<br/>"; 			
	}

Výsledok je opäť rovnaký.