Tutorials

SimpleXML

Uitleg en voorbeelden over SimpleXML extensie in PHP 5

Pagina 1

Inleiding

Deze tutorial gaat over SimpleXML. Zoals de naam al doet vermoeden heeft het met de webtaal XML te maken. SimpleXML is een extensie sie meegeleverd wordt bij PHP 5. Het is nu een officieele extensie, en niet wat de Nederlands PHP Manual doet beweren een experimentele. Omdat we met XML gaan werken, verwacht ik van je dat je de grondbeginselen van XML kent. Ala dat niet zo is moet je even hier natoe gaan, en anders kan je nu verder lezen.

In deze tutorial gebruiken we de volgende XML string:
<?xml version="1.0" standalone="yes"?>
<users>
<user id="1">
<name>Jan</name>
<sex>Man</sex>
<password>fu9f8w9080fd9id9di093r9f9if9if9d0sfu</password>
<avatar type="remote">http://www.avatars.com/av_1.gif</avatar>;
</user>
<user id="3">
<name>Piet</name>
<sex>Man</sex>
<password>fu9f8w9080fd9id9di093r9f9if9676674bv</password>
<avatar type="local">html/avatars/Eten%20en%20drinken/cola.png</avatar>
</user>
<user id="4">
<name>Ilse</name>
<sex>Vrouw</sex>
<password>fu9f8w9080fd9id9di4564564564539d0sfu</password>
<avatar type="none"></avatar>
</user>
<user id="5">
<name>Els</name>
<sex>Vrouw</sex>
<password>fu9f8w9080fd9id9di09gi5uy378wrfuih4w</password>
<avatar type="upload">avatar_1.gif</avatar>
</user>
(...)
</users>

In dit geval gaat het om een site met een drukke database. Deze site cached zijn gebruikers in de vorm van XML. Niet alle gegevens worden gecached, alleen de hoognodige. Zoals je ziet ik heb even een stuk weggeknipt, omdat we die proefkonijnen niet nodig hebben. Alleen de eerste 4 :)
Pagina 2

Informatie uitlezen

Nu hebben wij een mooi object waar de benodigde informatie in staat, maar hoe lezen we het uit? Dat doen we als volgt:
<?php
echo $users->user[0]->name; //Jan
?>
$users slaat op het object dat we op de vorige pagina hebben gemaakt. user[0] slaat op onze 'Jan' gebruiker. Dat komt, je raadt het al, 'user' een array is. 'name' slaat op de name tag in het xml bestand.

Uitlezen met behulp van foreachen
'user' kan je foreachen:
<?php
foreach ($users->user as $user) {
echo 'Naam: '. $user->name;
echo "\n";
echo 'Geslacht: '. $user->sex;
echo "\n\nAdmin opties:\n";
echo 'Avatar: '.$user->avatar.'('.$user->avatar['type'].')';
echo "\n";
echo '<a href="?editavatar&id='.$user['id'].'">Bewerken</a>';
}
?>

Dit is misschien wat ingewikkeld voor een beginner, maar ik zal het uitleggen:
$user->sex slaat op de sex tag in het XML bestand. $user->avatar['type'] slaat op het type attribuut van het avatar tag van de desbetreffende gebruiker. $user['id'] slaat op het id attribuut van de user tag.

Informatie defineren
De informatie die je eruithaalt is niet 'static', je mag eraanzitten. Je kan bijvoorbeeld Jan's avatar wijzigen: <?php
$users->user[0]->avatar = 'http://www.avatars.com/av_2.png';;
?>

Of alle avatars uitschakelen door middel van Xpath, dat SimpleXML ook ondersteunt: <?php
foreach ($users->xpath('//avatar') as &$avatar) {
$avatar['type'] = 'none';
}
?>
De refentie van $avatar slaat op dat in PHP 5 je kan referen in foreach loops, wat best makkelijk is!
Pagina 3

Informatie opslaan en ophalen

Opslaan methodes
We kunnen als beheerder van de site kiezen tussen twee dingen:
1. We kunnen de XML gegevens in een variabele opslaan die we in een PHP bestand opslaan.
2. We kunnen de XML gegevens in een XML bestand opslaan.

Zelf heb ik tot nu toe geen voorkeur, maar het PHP bestand kan je 'beveiligen' met een check op een bepaalde constante, maar hij moet ook geparsed worden. Opslaan in een php bestand is simpel:
<?php
$xml_users = <<<XML
(alle xml)
XML;
?>

Gegevens ophalen
De Cron Jobs doen s' nachts voor ons het cachewerk, maar wat heb je aan cachen als je het niet kan ophalen? Niets dus.

Methode 1
Eerst includen wij het php bestand met de xmlstring erin en dan halen wij de informatie op met simplexml_load_string($xml_users), als het laden faalt zal de functie FALSE terug geven:
<?php
//ons cachebestand includen
include 'example.php';

//informatie ophalen en ze in het object $users te stoppen
$users = simplexml_load_string($xmlstr);
?>

Methode 2
Deze methode is door de XML informatie uit een XML bestand te laden. Dan hoeven we alleen maar de bestandsnaam te weten:
<?php
//informatie ophalen uit XML bestand en die in het object $users stoppen
$xml = simplexml_load_file('cached_users.xml');
?>

Bekende struikelblokken
Ik heb PHP 4
Sorry, ik heb geen vervanging gevonden.

De functie geeft false terug
Dat betekent dat je een syntax error in het XML bestand.
Pagina 4

Informatie opslaan

Je kan de aangepaste informatie van de vorige pagina ook weer terugstoppen in ons bestand. Beide methodes uitgelegt. Vergeet niet dat je bestandje een CHMOD van 777 moet hebben.

Methode 1:
<?php
$xml = $users->asXML();
$filestr = "<?php\n";
$filestr .= "\$xml_users = <<<EOF\n";
$filestr .= $xml.'\n';
$filestr .= 'EOF;\n';
$filestr .= '?>';

file_put_contents('users.php', $filestr);
?>

Methode 2:
<?php
$xml = $users->asXML('cached_users.xml');
?>

$user->asXML(); slaat op de asXML() functie die het bestand weer terug compileerd naar XML 1.0 en file_put_contents() is natuurlijk de PHP 5 functie waarmee we ons zooitje in een bestand gooien. :)
Conclusie
Ik heb nu de basis van SimpleXML behandelt. Je weet nu hoe je een bestand moet openen en informatie in een object moet stoppen, je weet nu hoe je die informatie kan gebruiken, aanpassen, en weer terug opslaan. Ik hoop dat je er wat aan gehad hebt! Maar er zijn nog een aantal functie die ik niet (uitgebreid) behandeld hebt, maar ik zal de functie en gebruik ervan even kort opschrijven:

SimpleXMLelement->asXML( [bestandsnaam] );
Compileerd SimpleXMLelement naar XML 1.0 data. Als bestandsnaam is gegeven schrijft deze functie de data gelijk naar een bestand toe, en anders, met de bestandsnaam parameter dus niet gegeven, geef asXML() een string terug met de XML data. Als er iets fout gaat geeft deze functie FALSE terug.

SimpleXMLelement->attributes ( );
Geeft een SimpleXMLelement terug met de attributen van de SimpleXMLelement die gegeven is.

<?php
$string = <<<XML
<a>
<foo name="one" game="lonely">1</foo>
</a>
XML;

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
echo $a,'="',$b,"\"\n";
}
?>
Dit output:
name="one"
game="lonely"

SimpleXMLelement->children( );
Geeft de children van een member. Voorbeeld:
<?php
$xml = simplexml_load_string(
'<person>
<child role="son">
<child role="daughter"/>
</child>
<child role="daughter">
<child role="son">
<child role="son"/>
</child>
</child>
</person>');

foreach ($xml->children() as $second_gen) {
echo ' The person begot a ' . $second_gen['role'];

foreach ($second_gen->children() as $third_gen) {
echo ' who begot a ' . $third_gen['role'] . ';';

foreach ($third_gen->children() as $fourth_gen) {
echo ' and that ' . $third_gen['role'] .
' begot a ' . $fourth_gen['role'];
}
}
}
?> Dit output:
The person begot a son who begot a daughter; The person
begot a daughter who begot a son; and that son begot a son

SimpleXMLelement->xpath( path );
Voert een Xpath query uit op Xpath 'path'. Geeft een array met SimpleXMLelementen terug.

simplexml_import_dom ( DOMNode node )
Verkrijgt een SimpleXMLelement uit de DOMNode node. Bij falen geeft deze functie false terug.

Reacties

0
Nog geen reacties.