Vraag & Antwoord

Webprogrammeren & scripting

[XML & PHP] xml bestanden uitlezen

11 antwoorden
  • Ik heb een map met daarin meerdere mappen en daar weer in diverse bestanden(text bestanden, cvs-bestanden en xml bestanden) In elk bestand staan verzamelde email adressen die ik uit wil lezen en op het scherm geprint wil hebben Met cvs-bestanden en txt-bestanden gaat dat goed. Met de xml-bestanden niet. Ik krijg als error: could not open XML input dit ligt weer denk ik aan de [code:1:7b0c264bae]if (!($fp = @fopen($file1[$i], "r"))) {return false;}[/code:1:7b0c264bae] maar hoe of wat moet ik aanpassen ? [code:1:7b0c264bae] $base = 'email/'; function getFilesList($folder) { if ($handle = opendir($folder)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { $file1=file($folder.$file); for ($i=0;$i<count($file1);$i++) { if(substr($file,-3)=='txt') { $file1[$i]= str_replace('"', '', $file1[$i]); $file1[$i]= str_replace('";""', '', $file1[$i]); $file1[$i]= str_replace(';', '', $file1[$i]); echo "<font color=red size=2px>".$file1[$i]. "</font><br>"; } if(substr($file,-3)=='csv') { $explode = explode ('"', $file1[$i]); echo "<font color=red size=2px>".$explode[3]. "</font><br>"; } /////////////////////xml///////////////////////// if(substr($file,-3)=='xml') { function startElement($parser, $name, $attribs) { if (count($attribs)){foreach ($attribs as $k => $v){if($k=='URL') {//echo "<font color=red size=2px>".$v."</font><br>"; }}} } function endElement($parser, $name) {} function characterData($parser, $data) {} function defaultHandler($parser, $data){if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {}} function new_xml_parser($file1) { global $parser_file; $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); xml_set_element_handler($xml_parser, "startElement", "endElement"); if (!($fp = @fopen($file1[$i], "r"))) {return false;} $parser_file[$xml_parser] = $file1[$i]; return array($xml_parser, $fp); } if (!(list($xml_parser, $fp) = new_xml_parser($file1[$i]))) {die("could not open XML input");} while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d\n", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } xml_parser_free($xml_parser); } /////////////////////xml///////////////////////// } } } closedir($handle); } return $file1; } function getDirList($base) { if(is_dir($base)) { $dh = opendir($base); while (false !== ($dir = readdir($dh))) { if (is_dir($base . $dir) && $dir !== '.' && $dir !== '..') { $subs = $dir ; $subbase = $base . $dir . '/'; $aantal = getFilesList($subbase); if ($aantal!=0) { echo "map: " .$subbase . "<br>"; } getDirList($subbase); echo "<br>"; } else { next; } } closedir($dh); } else { print "Directory '<b>".$base."</b>' does not exist."; } } getDirList($base); [/code:1:7b0c264bae]
  • Onderstaande regels kloppen volgens mij niet. Nu moet ik zeggen dat de code ook niet uitblinkt in duidelijkheid en ik ook niet veel tijd heb om er naar te kijken, dus ik kan me vergissen. [code:1:7be3f31ca6]if (!($fp = @fopen($file1[$i], "r"))) {return false;} $parser_file[$xml_parser] = $file1[$i]; [/code:1:7be3f31ca6] Moet dat niet worden [code:1:7be3f31ca6]if (!($fp = @fopen($file1, "r"))) {return false;} $parser_file[$xml_parser] = $file1; [/code:1:7be3f31ca6]
  • Bedankt voor je reactie en tijd maar het werkt helaas niet sorrie voor de onduidelijkheid: met deze script kan ik dus achter elkaar alle bestanden uitlezen vandaar de [$i] achter $file dit gaat dus tot nu toe goed met m'n text bestanden en csv-bestanden: via en for loopie: [code:1:5907b581df] for ($i=0;$i<count($file1);$i++) { if(substr($file,-3)=='txt') { $file1[$i]= str_replace('"', '', $file1[$i]); $file1[$i]= str_replace('";""', '', $file1[$i]); $file1[$i]= str_replace(';', '', $file1[$i]); echo "<font color=red size=2px>".$file1[$i]. "</font><br>"; } if(substr($file,-3)=='csv') { $explode = explode ('"', $file1[$i]); echo "<font color=red size=2px>".$explode[3]. "</font><br>"; } }[/code:1:5907b581df] de xml-bestanden probeer ik ook in die loop te gooien maar dat lijkt niet te lukken.
  • Probeer dan wat te debuggen. Start maar met te bepalen wat het resultaat is van dit statement: [color=darkblue:b50c60a690]new_xml_parser($file1[$i])[/color:b50c60a690]
  • Verplaatst van "Programmeren" naar "[b:80e5b93db2]Web[/b:80e5b93db2]programmeren & scripting".
  • [quote:fd13992a49="Annie"]Probeer dan wat te debuggen. Start maar met te bepalen wat het resultaat is van dit statement: [color=darkblue:fd13992a49]new_xml_parser($file1[$i])[/color:fd13992a49][/quote:fd13992a49] je hebt gelijk.. niet dat ik nu weet hoe ik dit probleem anders kan aanpakken maar wanneer ik '$file' verander en in m'n error zin meeneem: [color=red:fd13992a49]if (!(list($xml_parser, $fp) = new_xml_parser($file))) {die("could not open XML input new_xml_parser($file)");}[/color:fd13992a49] zie ik het bestandsnaam wel staan in de error: [color=red:fd13992a49]could not open XML input new_xml_parser(test.xml)[/color:fd13992a49] maar zo blijft het dus bij 1 bestand terwijl ik meerdere xml-bestanden heb en die ik wil doorlopen. en ik weet eerlijk gezegt niet goed hoe ik die error opgelost krijg
  • [color=blue:86646491ac]if (!(list($xml_parser, $fp) = new_xml_parser($file))) { die("could not open XML input new_xml_parser($file) list($xml_parser, $fp) = new_xml_parser($file)"); }[/color:86646491ac] geeft [color=red:86646491ac]could not open XML input new_xml_parser(test.xml) list(, ) = new_xml_parser(test.xml)[/color:86646491ac]
  • [img:565d327e98]http://emots.wizja.net/emoty/muppet.gif[/img:565d327e98]anyone ?
  • Nee, ik bedoelde het resultaat wat je uit je functie terug krijgt. Wat staat daar in? Dus iets als: [code:1:7129c74521] $debug = new_xml_parser($file1[$i]); print_r($debug); [/code:1:7129c74521]
  • dat resultaat wordt al hier getoont ? [code:1:e64f2d831e]if (!(list($xml_parser, $fp) = new_xml_parser($file))) { die("could not open XML input new_xml_parser($file) list($xml_parser, $fp) = new_xml_parser($file)"); }[/code:1:e64f2d831e] achter dat [color=blue:e64f2d831e]die[/color:e64f2d831e] en de error word [color=blue:e64f2d831e]new_xml_parser($file)[/color:e64f2d831e] met inhoud toch ook uitgeprint ? - $file geeft test.xml - $file[$i] geeft nix terug maw, ik heb dit nog niet helemaal onder de knie, zou je me iets meer op weg kunnen helpen ? :oops:
  • Ik heb nog even een blik geworpen op je code en vermoed dat het probleem zit in de plek waar je de xml-parser hebt toegevoegd. Ik ben niet bekend met de exacte functionaliteit van php, dus kan je daar niet mee helpen, maar ik begrijp uit de manual dat xml_parse een complete string met xml-data verwacht. Jij doorloopt de inhoud van een bestand echter regel voor regel en binnen die lus plaats je de xml-parser. Wat je eerder zei: [quote:0bfb7acc85="sjemmie"]sorrie voor de onduidelijkheid: met deze script kan ik dus achter elkaar alle bestanden uitlezen vandaar de [$i] achter $file [/quote:0bfb7acc85] klopt dus niet. Het feit dat je meerdere bestanden kan uitlezen, zit 'm in de while-lus. De file1-array is een array van de inhoud van één enkel bestand (de functie file() geeft alle regels uit een bestand terug in een array). Stap 1 is dus de xml-functionaliteit buiten deze [color=blue:0bfb7acc85]for ($i=0;$i<count($file1);$i++)[/color:0bfb7acc85] lus halen. Bij het parsen van de xml moet je dan uitgaan van [color=blue:0bfb7acc85]$file[/color:0bfb7acc85], die variabele bevat namelijk de naam van je xml-bestand. Stap 2 is dat je de inhoud van [color=blue:0bfb7acc85]$file[/color:0bfb7acc85] in een string krijgt, zodat je deze kan gaan parsen met xml_parse(). Hopelijk kom je hiermee een stuk verder.

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.