anoniem Geplaatst: 12 februari 2003 Delen Geplaatst: 12 februari 2003 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 Quote Link naar reactie
anoniem Geplaatst: 13 februari 2003 Auteur Delen Geplaatst: 13 februari 2003 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 Quote Link naar reactie
Aanbevolen berichten
Om een reactie te plaatsen, moet je eerst inloggen