Vraag & Antwoord

Webprogrammeren & scripting

[XML & PHP] xml bestanden uitlezen

Anoniem
sjemmie
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:
  • 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:
  • [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
  • 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

Beantwoord deze vraag

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