Utisci korisnika

"Slučajno sam na nekoj diskusiji Infostuda našla vaš link i prosto sam zapanjena, obradovana i neizmerno ponosna što i u SRBIJI možemo da se služimo e-learning opcijom usavršavanja."…

Pre nepunih mesec dana kupila sam paket kurseva: PRIPREME ZA POLAGANJE CAMBRIDGE INTERNATIONAL DIPLOMA IN BUSINESS. Obično neki opšti utisak formiramo na kraju, ali ja u ovom trenutku želim sa…


Kompletna lista utisaka

Testiranje online

Arhitektura računara

Za one koji žele da znaju više.

Windows OS

Ovo bi svakako trebalo da probate.

Odnosi s javnošću

Koliko znate PR?

Pogledajte još neke od testova

Newsletter

Ukoliko želite da Vas redovno obaveštavamo o novostima sa Link eLearning sajta prijavite se na našu newsletter listu.

Ime:

Prezime:

Email:


Anketa

Arhiva anketa

BAZA ZNANJA


Kurs: PHP programiranje

Modul: Ulaz i izlaz

Autor:

Naziv jedinice: Rad sa XML-om


Materijali vezani uz ovu lekciju:

- Test rad sa xml-om
- Rad sa XML-om (PDF dokument)



Šta je XML (Extended Markup Language)

Jedan od čestih pojmova upotrebljavanih u kontekstu današnjeg programiranja jeste XML. Ovaj pojam često se „bespravno” upotrebljava da prezentuje programski jezik, iako XML to u stvari nije. XML je, naime, samo način za serijalizaciju podataka, odnosno način na koji ćemo jednostavno i brzo moći da zapamtimo podatke (a da pri tom to nije baza podataka) i prosledimo ih nekome ko će ih takođe razumeti, jer poštujemo iste konvencije.


Konvencije i sintaksa

Sa sintaksom xml-a već smo se odavno susreli, pisanjem prvog HTML taga. To je zato što i XML poštuje konvencije tagova, kao i HTML. Štaviše, čak i sama struktura tih tagova identična je HTML-u, jer se poštuje isti princip elemenata i atributa. Ipak, postoje neke osobenosti karakteristične isključivo za XML.

Pre svega, XML je osetljiv na mala i velika slova (case sensitive je). Zatim, ne sme u svom telu sadržati specijalne karaktere (njih treba prevesti u odgovarajuće ascii kodove). I konačno, trebalo bi da poseduje određenu strukturu (da ima koren, deklaraciju verzije...)


Struktura XML-a

Struktura XML dokumenta, nije nam nepoznata, jer smo je već obradili u jednoj od prošlih lekcija, radeći sa fajlovima.

Svaki XML fajl trebalo bi da poseduje deklaraciju:

<?xml version="1.0"? encoding="UTF-8" ?>

U deklaraciji prosleđujemo procesoru xml-a osnovne podatke o dokumentu: koja verzija XML-a je u pitanju, koji kodni raspored je korišćen u dokumentu...

Zatim, opciona je i deklaracija tipa dokumenta koja označava set pravila koja će biti poštovana tokom parsiranja dokumenta. Ova deklaracija može biti napravljena direktno u dokumentu ili učitana iz eksternog izvora.

<!DOCTYPE film SYSTEM "test.dtd">

Nakon DTD-a sledi koreni (document) element dokumenta, i konačno, naši serijalizovani podaci. Konačno, cela XML struktura izgleda ovako:

Prolog (Ovo je opis dokumenta, nije obavezan)
  XML Deklaracija (XML će funkcionisati i bez deklaracije, ali je poželjno da ona postoji)
    DTD Deklaracija (Za kompleksnije serijalizacije)
      Koreni element (Dokument)
        Elementi (Lista elemenata)
          Element – Atributi i vrednosti (Stavke iz liste)
            Podaci  (Podaci po stavci)



Izgradnja XML dokumenta

Recimo da želimo da stvorimo jedan XML dokument u kome će biti lista država.

<?xml version="1.0" encoding="UTF-8" ?>
<root>
<drzava oznakaDrzave="sr">
    <naziv>Srbija</naziv>
    <glavniGrad>Beograd</glavniGrad>
    <opis>Opis Srbije.....</opis>
</drzava>
<drzava oznakaDrzave ="fr">
    <naziv>Francuska</naziv>
    <glavniGrad>Pariz</glavniGrad>
    <opis>Opis Francuske.....</opis>
</drzava>
</root>

Jasno je razaznati elemente pomenute u prethodnom delu lekcije. Root je koren dokumenta, drzava predstavlja jedan element. oznakaDrzave je atribut tog elementa, a naziv, glavniGrad i opis su ugnježdeni elementi (podelementi) elementa drzava.


Pregled XML dokumenata

Sadržaj XML dokumentata pregledamo na više načina:

  • Iz pretraživača - obično svaki pretraživač poseduje svoj mehanizam za pregled XML dokumenata, ali generalno, većina izgleda isto.
  • Prerađene, deserijalizovane od strane programa koji ih parsira - svakodnevno rukujemo sa mnoštvom XML dokumenata, a da to i ne znamo. Većina programa čuva setovanja i ostale podatke u XML formatu.
  • U izvornom obliku - kao čist tekst.


Čitanje XML dokumenta

Iako XML podaci imaju lako čitljivu strukturu i pri tom jednostavnu za ručno parsiranje, kao i ostali jezici, i u PHP-u je sve više dobrih mehanizama za rukovanje XML-om (DOM XML, XMLParser...). Jedan od njih je i upotrebom klase SimpleXML. Za primer, možemo iskoristiti malopređašnji xml dokument sa gradovima, tako što ćemo ga snimiti u tekst dokument i taj dokument nazvati npr. proba.xml

Prvo što treba da uradimo, jeste da učitamo fajl u xml objekat (vodite računa da program bude u php tagovima, koji ovde nisu postavljeni zbog preglednosti):

$xml=simplexml_load_file('proba.xml');

Kada je jednom formiran xml objekat, potrebno je samo da pročitamo podatke, ručno

echo $xml->drzava[0]->naziv;

...pri čemu akcentujemo podatak koji nam je potreban koristeći indekse niza, ili kroz foreach petlju:

foreach($xml as $drzava)
{
    echo $drzava->naziv." - ". $drzava["oznakaDrzave"];
    echo "<br>" . $drzava->opis . "<br>";
}

U svakom krugu petlje, dobijamo po jedan objekat, čijim atributima pristupamo na gore navedeni način (više reči o klasama i objektima biće u narednim lekcijama).

Do xml sadržaja možemo doći i na sledeći način:

$sviPodaci = file_get_contents("proba.xml");
$xml = new SimpleXMLElement($sviPodaci);
...foreach petlja

U ovom slučaju, do stringa dolazimo uz pomoć funkcije za  čitanje file_get_contents() fajla koji smo obradili u prethodnim lekcijama i od tog stringa formiramo xml objekat, funkcijom SimpleXMLElement(). Umesto čitanja fajla, mogli smo xml strukturu u vidu stringa dobiti i iz nekog drugog izvora.


XPath čitanje

Dosadašnji način čitanja xml dokumenata je upotrebljiv ako je poznata kompletna infrastruktura XML dokumenta. Ali ne i ukoliko u strukturi xml dokumenta postoji bilo kakva tipska nesimptomatičnost, odnosno, ako dokument sadrži na jednom nivou različito imenovane elemente.

U ovakvim slučajevima korisno je upotrebiti XPath pristup čitanju.

Vratimo se u svrhu objašnjenja na primer sa gradovima. Ukoliko bi malo izmenili xml dokument, tako da izgleda ovako:

<?xml version="1.0"?>
<root>
<drzava oznakaDrzave="sr">
<grad>beograd</grad>
</drzava>
<zemlja oznakaDrzave="fr">
<naziv>francuska</naziv>
</zemlja>
</root>

Malopređašnji primeri sa čitanjem ne bi dali validan rezultat. Bili bi pročitani samo elementi koji se uklapaju u željeni patern (drzava->naziv). U ovom slučaju, samo prva država. Međutim, kada bi upotrebili XPath i to na sledeći način:

<?php
$rss =  simplexml_load_file('probaGradovi.xml');
foreach ($rss->xpath('//naziv') as $title) {
  echo "<h2>" . $title . "</h2>";
}
?>

dobili bi sve vrednosti elemenata naziv, koji se nalaze na traženom nivou a koji smo naznačili kosim crtama. Sada ćemo dobiti listu svih gradova, odnosno, svih vrednosti elemenata naziv, koji se nalaze na drugom nivou dokumenta.

Ovaj metod, iako je u nekim slučajevima veoma praktičan, nešto je sporiji od standardnog čitanja po nazivima elemenata.


Pisanje u XML

Za pisanje u XML-u, nije nam potrebna nikakva posebna tehnologija. Dovoljno je da malo unapredimo primer za pisanje fajlova iz jedne od prethodnih lekcija. Ovde ćemo, kao izvor podataka, priložiti tri niza, da bismo izbegli elemente koje još nosmo obradili (klase). U principu, ovakav pristup je potpuno nepravilan i sve to bi trebalo da uradimo putem neke struktuirane forme (klase).

<?php
//napravićemo prvo tri niza sa podacima
$drzave=array("srbija","francuska");
$gradovi=array("beograd","pariz");
$oznake=array("sr","fr");
//pravimo string sa deklaracijom xml-a
$xml="<?xml version=\"1.0\"?>\r\n";
//konkatiniramo na string koreni element xml dokumenta
$xml.="<root>\r\n";
//prolazimo u petlji kroz sve podatke koje imamo i dodajemo formatirane podatke u string
    for($i=0;$i<sizeof($drzave);$i++)
    {
    $xml.="<drzava oznakaDrzave=\"".$oznake[$i]."\">\r\n";
    $xml.="<naziv>".$drzave[$i]."</naziv>\r\n";
    $xml.="<grad>".$gradovi[$i]."</grad>\r\n";
    $xml.="</drzava>\r\n";
    }
//zatvaramo koreni element dokumenta
$xml.="</root>\r\n";
//upisujemo dobijeni string u fajl
file_put_contents("probaGradovi.xml",$xml);
?>


DOM XML

Dom je sistem za parsiranje XML-a ugrađen u endžin pretraživača. Ovaj sistem podrazumeva čitanje xml-a kroz sistem dece i roditelja gde je svaki element »roditelj« svojih podelemenata, i ti podelementi su njegova »deca«. Evo kako bi izgledalo čitanje naziva država sa DOM XML parserom.

<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load("probaGradovi.xml");
$x = $xmlDoc->documentElement;
foreach ($x->childNodes as $nod)
  {
    echo $nod->nodeValue;
  }
?>


Primer

Pogledajmo kako bi izgledao primer RSS čitača sa SimpleXML klasom:

Pre svega, napravićemo jedan rss-xml fajl uz pomoć koga ćemo da vršimo testiranje.

<?xml version="1.0"?>
<rss version="2.0">
   <channel>
      <title>Liftoff News</title>
      <link>http://liftoff.msfc.nasa.gov/</link>
      <description>Liftoff to Space Exploration.</description>
      <language>en-us</language>
      <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>
      <lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs>
      <generator>Weblog Editor 2.0</generator>
      <managingEditor>editor@example.com</managingEditor>
      <webMaster>webmaster@example.com</webMaster>
      <item>
         <title>Star City</title>
         <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>
         <description>How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>.</description>
         <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate>
         <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid>
      </item>
      <item>
         <description>Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm">partial eclipse of the Sun</a> on Saturday, May 31st.</description>
         <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate>
         <guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid>
      </item>
      <item>
         <title>The Engine That Does More</title>
         <link>http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp</link>
         <description>Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly.  The proposed VASIMR engine would do that.</description>
         <pubDate>Tue, 27 May 2003 08:37:32 GMT</pubDate>
         <guid>http://liftoff.msfc.nasa.gov/2003/05/27.html#item571</guid>
      </item>
      <item>
         <title>Astronauts' Dirty Laundry</title>
         <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link>
         <description>Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them.  Instead, astronauts have other options.</description>
         <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>
         <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid>
      </item>
   </channel>
</rss>


Zatim, koristeći naučenu tehnologiju, možemo pročitati i emitovati sadržaj fida:

<?php
//dobavljanje podataka
$sviPodaci = file_get_contents("rss.xml");
$xmlPodaci = new SimpleXMLElement($sviPodaci);
//prolaz kroz podatke, petljom
//rss fidovi imaju takvu strukturu
//da moraju imati nodove channel i rss
//svaki rss fid ima jedan channel nod i tek u njemu
//nalaze se nodovi sa vestima
//svaki nod sa vestima, naziva se item
foreach($xmlPodaci->channel->item as $clan)
{
//naslov
//ako je nod prazan, ispiši poruku
if($clan->title!="")
echo "<b>" . $clan->title . "</b><br>";
else
echo "nema naslov" . "<br>";
//link
if($clan->link!="")
{
echo "<a href='" . $clan->link . "'>" . $clan->link . "</a><br>";
}
else
//ako je nod prazan, ispiši poruku
echo "nema link<br>";
//opis
echo $clan->description . "<hr>";
}
?>


Najvažnije iz ove lekcije

  1. XML je jezik za serijalizaciju podataka, ali ne i jezik za njihovu obradu
  2. XML fajlovi su tekstualni fajlovi, sa posebnom strukturom
  3. XML se sastoji od tagova
  4. XML je case sensitive – osetljiv na velika i mala slova
  5. SimpleXML je klasa za rad sa XML-om.
  6. U XML strukturi razlikujemo elemente i atribute
  7. Dobro formirani xml podrazumeva deklaraciju sa verzijom i kodnim rasporedom
  8. XML mora imati koreni element


Više podataka

Nastanak XML-a

Istorija XML-a počinje još 60-ih godina prošlog veka, kada je u IBM u konstruisan prvi višenamenski jezik za serializaciju podataka. Ovaj jezik zvao se GML (Generalized Markup Language). Uspeh ovog jezika, doveo je do nastavka istraživanja na ovom polju, a veliki broj ljudi umešanih u to istraživanje, rezultirao je jezikom SGML (Standard Generalize Markup Language).

Deo SGML jezika iskorišten je za HTML-a (izgradnju HyperText Markup Language), dok je ostatak korišten za kompleksnije Internet aplikacije.

1996. godine počet je rad na uprošćenoj verziji SGML-a, čija je komplikovanost učinila da bude upotrebljavan samo u jakim velikim institucijama. Ovaj rad rezultirao je stvaranjem XML-a za čiju se godinu nastanka smatra 1998 godina. Do danas poznajemo dve verzije i nekoliko međuverzija XML-a. XML 1.0 i XML 1.1. Osnovna razlika je u rukovanju novim Unicode setovima, obzirom da razvoj XML-a ne prati paralelno i proširenje Unicode-a.


Smatrate da je ova lekcija korisna?  Preporučite je. Broj preporuka:3