tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von xanthos
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
1119
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Cluster Cluster ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Beiträge
    27
    Hallo zusammen

    also ich würde gerne einen Ordner incl aller Unterordner nach einem bestimmten Dateitypen durchsuchen lassen und dann mit SimpleXML einlesen in eine DB.
    Momentan bin ich soweit das ich mit SimpleXML nur einen bestimmten Ordner und eine bestimmte XML einlesen kann.

    PHP-Code:
    /*xml open*/
    $content simplexml_load_file('xml_ordner/datei.xml');

    /*get content*/
    $id $content->id;

    /*action after confirm*/
    if (isset( $_POST['eintragen'] ))
    {
                
    mysql_query("INSERT INTO db (id)
                                    VALUES ('
    $id');

    /*If the database has been updated*/
    if(mysql_affected_rows() > 0)
    {
      echo "
    Daten wurden eingetragen!!<br /><br />";
    }
    else
    {
      echo "
    Daten wurden nicht eingetragen!!<br /><br />";
    }


    Nur wie bewege ich nun SimpleXML dazu in allen Ordnern und Unterordnern nach datei.xml zu suchen da ich eine Ordnerstrucktur habe mit einem Hauptordner und 3 Unterordner welche 3 verschieden benannten XML (z.B: datei1.xml, datei2.xml, datei3.xml) enthalten.

    grüße
    Geändert von Cluster (02.09.09 um 12:51 Uhr)
     

  2. #2
    xanthos xanthos ist offline Mitglied Silber
    Registriert seit
    May 2008
    Beiträge
    98
    Mti SimpleXML wirst Du wohl keine Ordner nach XML-Dateien durchsuchen können.

    Ich weiss nicht, ob es in PHP dazu bereits eine fertige Funktion gibt. Wenn nicht, würde ich das in etwa so machen (ungetestet):

    PHP-Code:
    <?php

      
    function get_files($_dir,$_filename_regex){
        
        global 
    $_dir_array$_file_array;
        
        
    $_scan scandir($_dir);
        foreach(
    $_scan as $_value){
        
          if(
    is_dir($_dir.'/'.$_value)) $_dir_array[] = $_dir.'/'.$_value;
          elseif(
    preg_match($_filename_regex,$_value)) $_file_array[] = $_dir.'/'.$_value;
        
        }
      
      }
      
      
      
    $_start_dir 'pfad/zum/ordner';
      
    $_dir_array = array($_start_dir);
      
    $_file_array = array();

      foreach(
    $_dir_array as $_dirget_files($_dir,'/^[^\.]+\.xml$/');

    ?>
    Die gefundenen XML-Dateipfade befinden sich anschliessend alle in der Varible $_file_array.
    Geändert von xanthos (02.09.09 um 13:40 Uhr)
     

  3. #3
    Cluster Cluster ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Beiträge
    27
    leider bekomme ich hier mit

    print_r($file_array);

    nichts ausgegeben aber der Pfad zum Ordner stimmt eigentlich.
     

  4. #4
    xanthos xanthos ist offline Mitglied Silber
    Registriert seit
    May 2008
    Beiträge
    98
    Hier der korrigierte Code (dieses mal getestet ):

    PHP-Code:
    <?php

      
    function get_files($_dir,$_filename_regex){

        global 
    $_dir_array$_file_array;

        
    $_scan scandir($_dir);
        foreach(
    $_scan as $_value){

          if(!
    preg_match('/^\.+$/',$_value)){
            if(
    is_dir($_dir.'/'.$_value)) $_dir_array[] = $_dir.'/'.$_value;
            elseif(
    preg_match($_filename_regex,$_value)) $_file_array[] = $_dir.'/'.$_value;
          }

        }

      }


      
    $_start_dir 'pfad/zum/ordner';
      
    $_dir_array = array($_start_dir);
      
    $_file_array = array();
      
      while(
    count($_dir_array) > 0get_files(array_shift($_dir_array),'/^[^\.]+\.xml$/');
      
    print_r($_file_array);

    ?>
    Geändert von xanthos (03.09.09 um 18:03 Uhr)
     

  5. #5
    Cluster Cluster ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Beiträge
    27
    Sehr geile Sache muss ich mich mal reinlesen was genau da alles passiert :
    Bin noch absoluter php-neuling und würde nähmlich gerne die XML`s an eine DB übergeben, mit einer gings bisher einwandfrei nun kommt also das nächste "Kapitel" im Lehrbuch mit dem Zugriff auf Arrays und der Ein und Ausgabe über MySQL, vielen Dank

    Muss ich nun also anhand des Indexes des Array über den Pfad in der XML wie gehabt dann auf die entsprechenden Werte zugreifen?

    Bei einer einzelnen mache ich das ja in etwa so:

    PHP-Code:
    $title $batch->items->item->title
    währe das dann z.b. für eine Xml aus dem Array etwa so?

    PHP-Code:
    echo $title $batch->items->item->title[1]; 
    Geändert von Cluster (03.09.09 um 17:57 Uhr)
     

  6. #6
    Avatar von Flex
    Flex Flex ist offline (aka Felix Jacobi)
    tutorials.de Moderator
    Registriert seit
    Nov 2001
    Ort
    Wuppertal
    Beiträge
    5.295
    Blog-Einträge
    65
    Noch einfacher würde es übrigens mit glob() gehen.
     
    KIDS Kinderbetreuungsdienst
    Xing

    "When you play the game of thrones, you win or you die. There is no middle ground."
    by Cersei Lannister in "A Game Of Thrones"

  7. #7
    xanthos xanthos ist offline Mitglied Silber
    Registriert seit
    May 2008
    Beiträge
    98
    Zitat Zitat von Cluster Beitrag anzeigen
    währe das dann z.b. für eine Xml aus dem Array etwa so?

    PHP-Code:
    echo $title $batch->items->item->title[1]; 
    Nein. Die XML-Dateien arbeitest Du am besten nach der while-Schleife mit foreach ab. So werden alle XML-Dateien einzeln nacheinander geöffnet.

    PHP-Code:
    ...

    while(
    count($_dir_array) > 0get_files(array_shift($_dir_array),'/^[^\.]+\.xml$/');

    foreach(
    $_file_array as $_file){

        
    /*xml open*/
        
    $content simplexml_load_file($_file);

        
    /*get content*/
        
    $id $content->id;

       ...

    }

    ... 
    Ach ja:

    PHP-Code:
    mysql_query("INSERT INTO db (id) VALUES ('$id'); 
    Das schliessende Anführungszeichen am Ende der Zeile (vor dem Semikolon) nicht vergessen.
    Geändert von xanthos (03.09.09 um 18:21 Uhr)
     

  8. #8
    Cluster Cluster ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Beiträge
    27
    Alos ich habs so probiert mit deinem Code:

    PHP-Code:
      function get_files($_dir,$_filename_regex){

        global 
    $_dir_array$_file_array;

        
    $_scan scandir($_dir);
        foreach(
    $_scan as $_value){

          if(!
    preg_match('/^\.+$/',$_value)){
            if(
    is_dir($_dir.'/'.$_value)) $_dir_array[] = $_dir.'/'.$_value;
            elseif(
    preg_match($_filename_regex,$_value)) $_file_array[] = $_dir.'/'.$_value;
          }

        }

      }


      
    $_start_dir 'xml_video/';
      
    $_dir_array = array($_start_dir);
      
    $_file_array = array();
      
    while(
    count($_dir_array) > 0get_files(array_shift($_dir_array),'/^[^\.]+\.xml$/'); 


    foreach(
    $_file_array as $file){
    $content_batch simplexml_load_file($file);


    /*get content*/
    $con_id $content["id"];
    $email =  $content->email["address"];
    $title $content->title;
    $dvd $content->value;
    $aspects $content->aspects->aspect;

        for(
    $i 0$i 30$i++)
        {
          
    $arr2[] = $aspects[$i];
        }
        
    $data implode(":"$arr2);


    }
    /*action after confirm*/
    if (isset( $_POST['eintragen'] ))
    {
     

                
    mysql_query("INSERT INTO db (con_id,email,title,dvd,aspects,added)
                                    VALUES ('
    $con_id','$email','$title','$dvd','$data',NOW())");

    /*If the database has been updated*/
    if(mysql_affected_rows() > 0)
    {
      echo 
    "Daten wurden eingetragen!!<br /><br />";
    }
    else
    {
      echo 
    "Daten wurden nicht eingetragen!!<br /><br />";
    }


    header("Refresh: 0; url=index.php");


    jedoch werden mir dann keine Daten mehr ausgegeben, kann es sein das es eine Rolle spielt wenn die XML`s unterschiedliche Attribute haben und Objekte das es dann nicht geht?
    aspects[] ist eine Liste von Feldern die alle apsects heissen aber unterschiedliche Werte haben evtl macht das auch die Probleme?

    grüße und vielen Dank für eure Hilfe

    edit:

    wobei mit

    PHP-Code:
      print_r($_file_array); 
    bekomme ich das array der files zurück.

    mit

    PHP-Code:
    $content_batch simplexml_load_file(pfad); 
    kann ich aber einwandfrei auf alles in der xml zugreifen und speichern.
    Geändert von Cluster (03.09.09 um 22:40 Uhr)
     

  9. #9
    xanthos xanthos ist offline Mitglied Silber
    Registriert seit
    May 2008
    Beiträge
    98
    Naja, die MySQL-Anweisung muss natürlich auch in die foreach-Schleife. Sonst wird nur die letzte XML-Datei eingetragen.
     

  10. #10
    Cluster Cluster ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Beiträge
    27
    Funktioniert schon recht gut aber es gibt da ein paar Sachen die ich so nicht herrausfinden kann irgendwie
    Also ich würde gerne alle Daten aus den XMLs aus dem jeweiligen Hauptordner in einen DB Eintrag bekommen da diese immer zusammen gehören vom Inhalt her, die Schleife versucht jedoch jede XML in einen einzelnen DB Eintrag zu bekommen.
    Die Felder und Abfragen für alle Elemente in den XML`s hab ich so hinbekommen nur nicht das auch alle daten dann nur einer ID in der Datenbank zugeordnet werden.

    vielen Dank für deine Hilfe alleine würd ich das wohl nie gebacken bekommen
    Geändert von Cluster (04.09.09 um 14:40 Uhr)
     

  11. #11
    xanthos xanthos ist offline Mitglied Silber
    Registriert seit
    May 2008
    Beiträge
    98
    Wenn Du den Inhalt aller XML-Dateien in einen einzigen DB-Eintrag speichern willst, musst Du die Daten zuerst sammeln (z.B. in einem Array). Mit implode() kannst Du anschliessend die einzelnen Array-Elemente verknüpfen.

    PHP-Code:
      function get_files($_dir,$_filename_regex){

        global 
    $_dir_array$_file_array;

        
    $_scan scandir($_dir);
        foreach(
    $_scan as $_value){

          if(!
    preg_match('/^\.+$/',$_value)){
            if(
    is_dir($_dir.'/'.$_value)) $_dir_array[] = $_dir.'/'.$_value;
            elseif(
    preg_match($_filename_regex,$_value)) $_file_array[] = $_dir.'/'.$_value;
          }

        }

      }


      
    /*action after confirm*/
      
    if(isset($_POST['eintragen'])){


        
    // XML-Dateien suchen
        
    $_start_dir 'xml_video/';
        
    $_dir_array = array($_start_dir);
        
    $_file_array = array();

        while(
    count($_dir_array) > 0get_files(array_shift($_dir_array),'/^[^\.]+\.xml$/');
      
      
        
    // XML-Dateien einlesen
        
    $con_id = array();
        
    $email = array();
        
    $title = array();
        
    $dvd = array();
        
    $data = array();

        foreach(
    $_file_array as $file){

          
    $content_batch simplexml_load_file($file);

          
    /*get content*/
          
    $con_id[] = $content["id"];
          
    $email[] =  $content->email["address"];
          
    $title[] = $content->title;
          
    $dvd[] = $content->value;

          
    $arr2 = array();
          
    $aspects $content->aspects->aspect;
          for(
    $i 0$i 30$i++) $arr2[] = $aspects[$i];
        
          
    $data[] = implode(":"$arr2);

        }


        
    /*If the database has been updated*/
        
    $_sql "INSERT INTO db (con_id,email,title,dvd,aspects,added)
                 VALUES ('"
    .implode('',$con_id)."','".implode('',$email)."',
                         '"
    .implode('',$title)."','".implode('',$dvd)."',
                         '"
    .implode('',$data)."',NOW())";
        if(
    mysql_query($_sql))
          echo 
    "Daten wurden eingetragen!!<br /><br />";
        else
          echo 
    "Daten wurden nicht eingetragen!!<br /><br />";


        
    header("Refresh: 0; url=index.php");

      } 
    Cluster bedankt sich. 

  12. #12
    Cluster Cluster ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Beiträge
    27
    Also habs nun soweit das es halbwegs funktioniert jedoch werden nur die XML`s übernommen mit dem Index 0 und 2, das mit dem Index 1 leider nicht.

    Ordnerstruktur schaut etwa so aus:

    Hauptordner/XML[0] und XML[1]
    Hauptordner/Unterordner/XML[2]

    Kann es sein das die Funktion nach dem finden einer XML direkt in den nächsten Ordner springt?


    EDIT: so habs mal umständlich gelöst aber egal nun gehts

    PHP-Code:

            $xml 
    simplexml_load_file($_file_array[0]); 
            
    $xml1 simplexml_load_file($_file_array[1]); 
            
    $xml2 simplexml_load_file($_file_array[2]); 
    musste leider rein da die function sonst alles durcheinander gewürfelt hatte.

    Vielen Dank für die Denkanstöße
    Geändert von Cluster (07.09.09 um 12:53 Uhr)
     

Ähnliche Themen

  1. XML durchsuchen -> simplexml
    Von webbudda im Forum PHP
    Antworten: 8
    Letzter Beitrag: 30.10.09, 01:38
  2. XML einlesen mit SimpleXML
    Von mcready im Forum PHP
    Antworten: 2
    Letzter Beitrag: 19.01.09, 16:16
  3. Antworten: 2
    Letzter Beitrag: 31.10.08, 16:20
  4. Antworten: 6
    Letzter Beitrag: 06.05.08, 09:45
  5. Ordner nach Dateien durchsuchen lassen?
    Von heikoarndt im Forum .NET Archiv
    Antworten: 2
    Letzter Beitrag: 23.03.04, 12:47

Stichworte