MME Lente 07| PHP maakt XML

Leerdoelen

Samenvatting les inhoud

Voor bestandsuitwisseling tussen verschillende applicaties is XML een handig hulpmiddel. PHP kan XML lezen en schrijven. Deze les wordt dieper ingegaan op het schrijven naar een XML vanuit PHP in relatie met RSS feeds (RSS = XML). Deze les hoef je niet echt niet te begrijpen, maar wil ik toch graag aanbieden, omdat deze informatie helpt bij het verder automatiseren van PHP en XML.

De stappen

Om vanuit SQL een RSS(XML) te genereren moeten er een aantal stappen doorlopen worden. De stappen zijn: SQL - > PHP - > (RSS) XML. In pricipe verwerkt Het PHP document alles. Je zou er natuurlijk een functie of een class van kunnen maken zodat deze wordt aangeroepen op het moment dat je iets met een site doet.

PHP en SQL

We gaan in dit voorbeeld uit van een zeer eenvoudige database met 2 tabellen. Tabel 1 bevat de hoofdinformatie van de verschillende RSS bestanden die we willen schrijven. De andere tabel heeft hiermee een relatie om de items weer te geven. Uiteindelijk willen we naar de structuur die weergegeven is in de RSS les.

ERD: Feed

Eerst moeten we op de gebruikelijk manier een connectie maken met SQL, waarbij we een host, username en password geven en vervolgens de database selecteren. Bij elk RSS_channel record horen 1 of meerdere items. Dus we maken in dit geval gebruik van een loop in een loop!.

Van PHP naar XML

Als de loop alle database velden is doorgelopen en alle xml-Nodes heeft aangemaakt, kan je de xml printen op het scherm. Zie onderstaand script:

// eerst de xml definitie om aan te geven dat het hierom een xml bestand gaat  
$xml = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
$xml .= "<basis>\n";
// een loop om de database resultaten te verwerken
while ($row = mysql_fetch_array($result)) {
$xml .= "<item nummer='" .$row["art_id"]. "' prijs='" . $row["prijs"]. "'>";
$xml .= $row["omschrijving"]. "</item>\n"; }
// daarna ook de xml afsluiten $xml .= "</basis>\n";
// plaats de xml op het scherm print $xml;

De .= voegt de nieuwe informatie telkens toe aan de zelfde variabele, waardoor je op het laatst deze kan printen op het scherm. De /n zorgt ervoor dat er in de xml ook enters komen, en ieder item weer op een volgende regel komt. Dit levert afhankelijk van de inhoud van je database deze xml code op:

<?xml version="1.0" encoding="iso-8859-1"?>   
<basis>
   <item nummer = '1' prijs = '10.00'>Dit is het eerste artikel uit mijn collectie.</item>
  	<item nummer = '2' prijs = '85.00'>Dit is al weer een artikel deze keer mijn tweede</item>
	<item nummer = '3' prijs = '123.95'>en nog meer, het derde artikel!</item>
</basis>

Objecten in PHP

Het generen van XML kan op vele manieren maar de beste (snelste en eenvoudigste) manier is gebruik maken van een standaard xml component van PHP. De xml component is object georiënteerd. Op die manier hoef je geen zorgen te maken voor over allerlei formatting punten.

Objecten in het algemeen zijn te vergelijken met MovieClips in flash. Belangrijkste om te weten is dat Objecten een aantal standaard begrippen gebruiken:

Het object is een kopie van een Class (denk aan de instance op de stage).

Een nieuw object beginnen in PHP kan alleen als de Class is gedefineerd. Voor het XML Class is deze dus al aanwezig. Let op tussen PHP4 en PHP5 zijn grote verschillen. Het object leeft alleen als het script wordt uitgevoerd en dus niet meer als je pagina in je browser te zien krijgt. Het is dus geen manier om data op te slaan.

In het algemeen kun je als je een class heb gedefineerd (methods, properties) een nieuw object starten. Dat gebeurt op met de volgende syntax constructie die lijkt op actionscript.

Stel we hebben een class geschreven met de volgdende methods

$Object = new ClassName;

Om properties te plaatsen en te verkrijgen wordt de sytax echter iets anders dan  in actionscript.

$Object->Waarde1 = “een waarde”; 

Let op Binnen PHP moet je natuurlijk elke variabele beginnen met een $, als je een waarde in een class aanroept moet je deze echter niet gebruiken.

Een method aanroepen gaat bijna op dezelfde manier:

$Object->set_Param(“argument”); $nieuw_Waarde = $Object->get_Param(); 

 

XML Object Functies (methods)

Binnen de XML parser van PHP zijn de methods en argumenten al vastgesteld. Bijvoorbeeld een van de methods werkt zodaning dat als je een child node opent je hem niet meer af hoeft te sluiten. Dat gaat automatisch.

Elk XML object begint met de volgende regel.

$doc = domxml_new_doc("1.0"); 

dit geeft uiteindelijk de uit put van de volgende regel:

<?xml version="1.0"?>

We hebben dus nu een de eerst regel van ons XML geschreven wat nu volgt is een aantal stappen die vast staan bij RSS. Elk RSS document begint met de tag RSS en een attribute version, gevolgd door een genest tag Channel. Eest begin we met een de RSS tag. Deze is een kind van de totale document structuur dus onderdeel van het  $doc object.

$rss = $doc->new_child("rss", "");

De new_child method heeft twee argumenten 1 de naam van de tag en 2 de inhoud die binnen de tag geschreven moet worden. Als de tag genest wordt (wat bij ons het geval is) laat je het tweede argument leeg. Vervolgens willen we deze tag - rss - vullen met een attribute. Dat gebeurt als volgt:

$rss->set_attribute("version", "2.0");

De nieuw aangemaakte $rss kunnen we gebruiken om deze met een attribute te vullen. Om de - rss  - te vullen met genest elementen maken we op dezelfde manier gebruik van $rss en wel als volgt:

$channel = $rss->new_child ("channel", "");

Dit waren de vaste waarden die nodig zijn voor het maken van ons RSS document. Afhankeijk van de database en de tabellen kunnen we nu op dezelfde manier kinderen maken voor channel (title, link en description) en als kind van channel het item met zijn eigen kinderen.
Dat gaat dan als volgt....

$chan_title = $channel->new_child ("title", " the title of this document"); 
$chan_link = $channel->new_child ("link", "http://www.mysite.com"); 
$chan_desc = $channel->new_child ("description", "some stories"); 

En ook zo voor de item elementen. Als je gebruikt maakt van een Database dan met je het tweede argument vervangen voor de waarde uit de data base.

Het schrijven van een XML bestand

We hebben nu alles gevuld in het $doc object. We moeten het alleen wegschrijven. Dat kan met de dump_file method. De argumenten voor deze method zijn 1: De naam van het document, 2 eventuele compressie en 3 of er ook een type bestand moet worden geschreven. Wel nu we hebben geen compressie maar wel een XML bestand.

$doc->dump_file("MY.rss", false, true); 

let op dit werkt waarschijnlijk niet op je locale server (wel op die van school).

 

Auteur: Roos Groenewegen
Seizoen: Winter
Lesnummer: 07
Datum: 13-12-2005
Type les: MME