Ga naar inhoud

[PHP] XML parsen


anoniem

Aanbevolen berichten

Ik probeer een extern XML bestand te parsen. Hiervoor heb ik de volgende code geschreven:[code:1:f5b16eb000]<?php // Bronbestand $xmlsourcefile = "xml.txt"; // Document object creëren $dom = xmldocfile($xmlsourcefile) or die ("Kan XML bestand niet openen"); // Verwijzing naar root node $root = $dom->root() or die ("Kan root niet openen"); // Toon naam van de root echo $root->name; // Verwijzing naar de sections $sections = $root->children() or die ("Kan sections niet opvragen"); for($i=0;$i<count($sections);$i++){ // Controle of we met een geldige node te maken hebben ivm spaties is het bronbestand if($sections[$i]->type == XML_ELEMENT_NODE){ // Toon name-attribuut van deze sectie echo '<b>'.domxml_getattr($sections[$i], "name").'</b><br />'; // Verwijzing naar documents $documents = $sections[$i]->children() or die ("Kan documents niet opvragen"); for($j=0;$j<count($documents);$j++){ // Wederom controle if($documents[$j]->type == XML_ELEMENT_NODE){ // Toon inhoud (content) van document echo '-- <i>'.$documents[$j]->content.'</i><br />'; // Toon href-attribuut echo '---- <u>'.domxml_getattr($documents[$j], "href").'</u><br />'; } } } } ?>[/code:1:f5b16eb000]Het bronbestand, laten we het "xml.txt" noemen, bevat:[code:1:f5b16eb000]<basje> <section name="Humor"> <document href="http://www.basje.com/humor/aaa.html">AAA</document> <document href="http://www.basje.com/humor/bbb.html">BBB</document> </section> <section name="Links"> <document href="http://www.basje.com/links/ccc.html">CCC</document> <document href="http://www.basje.com/links/ddd.html">DDD</document> </section> </basje>[/code:1:f5b16eb000]Helaas werkt de code niet, de content & rootnaam worden niet getoond, maar de attributen wel. :o Wie o wie vertelt me waar de fout zit? - Bas
Link naar reactie
Pfffffff... Na lang door de PHP manual bladeren en zoeken op internet heb ik de oplossing gevonden: een denkfout. Ik zal mijn bevinding hieronder kort uitleggen voor de eventuele geïnteresseerden. Stel je hebt de volgende XML broncode:[code:1:0376f5103b]<?xml version="1.0"?> <book type="paperback"> <title>Red Nails</title> <price>$12.99</price> <author> <name first="Robert" middle="E" last="Howard"/> <birthdate>9/21/1977</birthdate> </author> </book>[/code:1:0376f5103b]De structuur zou er dan als volgt uitzien:[code:1:0376f5103b]DomNode book | |-->DomNode title | | | |-->DomNode text | |-->DomNode price | | | |-->DomNode text | |-->DomNode author | |-->DomNode name | |-->DomNode birthdate | |-->DomNode text[/code:1:0376f5103b]Met andere woorden; een stuk tekst tussen de tags is een node op zich en moet dus ook nog apart worden opgevraagd als zijnde een child van de tag. Zo moeilijk als het vinden van het probleem dus was, zo makkelijk is de oplossing: een extra for-loopje om een niveau dieper in de XML-hierarchie te gaan. De uiteindelijke werkende (!) code ziet er als volgt uit:[code:1:0376f5103b]<?php // Bronbestand $xmlsourcefile = "xml.txt"; // Document object creëren $dom = xmldocfile($xmlsourcefile) or die ("Kan XML bestand niet openen"); // Nieuwere versie: // $dom = domxml_open_file($xmlsourcefile) or die ("Kan XML bestand niet openen"); // Verwijzing naar root node $root = $dom->root() or die ("Kan root niet openen"); // Toon naam van de root echo $root->name; // Verwijzing naar de sections $sections = $root->children() or die ("Kan sections niet opvragen"); for($i=0;$i<count($sections);$i++){ // Controle of we met een geldige node te maken hebben ivm spaties is het bronbestand if($sections[$i]->type == XML_ELEMENT_NODE){ // Toon name-attribuut van deze sectie echo '<b>'.domxml_getattr($sections[$i], "name").'</b><br />'; // Verwijzing naar documents $documents = $sections[$i]->children() or die ("Kan documents niet opvragen"); for($j=0;$j<count($documents);$j++){ // Wederom controle if($documents[$j]->type == XML_ELEMENT_NODE){ // Toon inhoud (content) van document $contents = $documents[$j]->children() or die ("Kan contents niet opvragen"); for($k=0;$k<count($contents);$k++){ if($contents[$k]->type == XML_TEXT_NODE){ echo '-- <i>'.$contents[$k]->content.'</i><br />'; } } // Toon href-attribuut echo '---- <u>'.domxml_getattr($documents[$j], "href").'</u><br />'; } } } } ?>[/code:1:0376f5103b]Ik hoop dat iemand er wat aan heeft, voor mij gaat er in ieder geval een nieuwe wereld aan mogelijkheden open. Ik ga nu slapen, er zit een lange maar uiteindelijk vruchtvolle dag op. O ja, [url=http://www.phpbuilder.com/columns/matt20001228.php3]hier[/url] is het bestand dat me uiteindelijk heeft geholpen, gevonden via de [url=http://www.php.net/manual/en/ref.domxml.php]DOM/XML PHP Manual[/url]. - Bas
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...