parsen von xml ergibt keine ausgabe

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • parsen von xml ergibt keine ausgabe

    hi, habe folgendes problem. ich möchte gerne daten aus einem xml dokument mit php parsen. der nächste schritt wäre dann die daten per php an die db zu senden. nur komme ich nicht mehr weiter. ich habe folgendes script zusammen gebastelt jedoch bekomme ich keine ausgabe, woran kann das liegen.
    hier mal mein coding:
    PHP-Code:
    <?php
    function startElement($parser$element_name$element_attribute
    {
        global 
    $ausgabe;
        
    //Umwandeln in Kleinbuchstaben
        
    $element_name strtolower($element_name);
        
    //Überprüfung des Elementnames
        
    if ($element_name=="inhalt"
        {
            
    $ausgabe .= "<h3>Inhalt</h3><p>";
        }
    }
    function 
    endElement($parser$element_name
    {
        global 
    $ausgabe;
        
    // in Kleinbuchstaben umwandeln
        
    $element_name strtolower($element_name);
        
    // Überprüfung des Names eines Elementes
        
    if ($element_name=="inhalt"
        {
        
    $ausgabe .= "</p>";
        }
    }
    function 
    cdata($parser$element_inhalt
    {
        global 
    $ausgabe;
        
    // Der normale Text wird an $ausgabe angehängt
        
    $ausgabe .= $element_inhalt;
    }
    $xmlFile file("test_neu.xml");
    $parser xml_parser_create();
    xml_set_element_handler($parser"startElement""endElement");
    xml_set_character_data_handler($parser"cdata");
    foreach(
    $xmlFile as $elem)
    {
        
    xml_parse($parser$elem);
    }
        
    xml_parser_free($parser);

        echo 
    $ausgabe;
    ?>
    kurz noch erwähnt, bin heute auf PHP5 umgestiegen aber laut http://www.pc-magazin.de/praxis/wind...ble=pg&id=1227
    unterstützt es alles wunderbar.
    danke im voraus...bye bye crunny.
    bye bye crunny

  • #2
    da du ja jetzt php5 hast:
    http://de.php.net/simplexml
    mfg,
    [color=#0080c0]Coragon[/color]

    Kommentar


    • #3
      simplexml klappt wunderbar...aber

      hi coragon, danke erst einmal für die schnelle antwort.
      mit simplexml klappt die ausgabe wunderbar.
      ich möchte jetzt die daten an mysql senden. bspw:
      PHP-Code:
      <Oberobject>
             <
      Object id="2" seqNumber="0">
                  <
      title>test 2</title>
                  <
      art>keine</art>
                  <
      beschreibung>testversion</beschreibung>
                  <
      notiz/>
                  <
      autor>ich</autor>
                  <
      datum>19.05.2005</datum>
              </
      Object>
      </
      Oberobject
      simplexml erzeugt objekte (object(SimpleXMLElement)#1 (1) {...}.
      wie greife ich jetzt auf die Objekte zu damit ich diese an mysql senden kann? also wie sende ich bspw. test 2, keine, testversion, ich, 19.05.2005 an mysql???
      Die DB steht schon mit den Knoten als Felder.
      mir fehlt da die vorstellung!
      Man muss noch berücksichtigen das es mehrere <Object> Knoten geben wird.
      kannst du mir da weiterhelfen? danke im voraus bye bye crunny.
      bye bye crunny

      Kommentar


      • #4
        Du kannst einfach sowas hier machen um auf die Werte zuzugreifen:
        PHP-Code:
        $SX simplexml_load_file('bla.xml');

        $SubObjekte $SX->children();//das sind in deinem Fall alle Objekt-Knoten
        foreach($SubObjekte as $SubObjekt)
        {
          echo 
        'Object/Title => '.(string)$SubObjekt->title;//wichtig!

        Der Typecast innerhalb des foreach's ist wichtig, um nicht später etwas wie "Object #12" oder ähnliches angezeigt zu bekommen.

        Edit: Auf Attribute greifst du folgendermaßen zu:
        PHP-Code:
        echo (string)$Objekt['AttributName']; 
        "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

        Kommentar


        • #5
          hi nezzar, danke für die schnelle antwort. wenn ich die elemente der xml datei im browser ausgeben will funktioniert das wunderbar.
          Mein ziel jedoch ist es die elemente direkt in die mysql db zu senden, hab mal dieses script entwickelt aber funktioniert nicht so wie ich will :-). die connection zu db steht, das konnt ich daran sehen, das er mir mein primary key (id) welches auf autoincrement steht, hochgezählt hat. aber die elemente hat er nicht gesendet. weisst du warum. hier mal der code: kann ich nicht die foreach schleife zum senden verwenden????
          PHP-Code:
          $filename 'output_1.xml';
              if(
          file_exists($filename)) {
                  
          $xml simplexml_load_file($filename);
                  if(
          $xml) {
                      foreach(
          $xml->Lesson_Unit->learningObject as $lobject
                      {
                            
          $author $_POST['lobject->author'];
                           
          $creation_date $_POST['lobject->creation_date'];
                           
          $description $_POST['lobject->description']; 
                       
          $title $_POST['lobject->title']; 
              
          /* $insert erhält als Wert die Rückgabe aus der folgenden Datenbankabfrage. In diesem Fall true oder false */
          if($insert = @mysql_query("INSERT INTO e_lesson SET author = '$author', date = '$creation_date', description = '$description', 
          title = '
          $title'")) 
          {  echo 
          '<p align="center">....Succesfully....</p>';
              die; 
          }
          else
          {  echo 
          '<p align="center">-----sending failed------</p>';
              die;

          ginge das theoretisch???
          danke im voraus bye crunny...
          bye bye crunny

          Kommentar


          • #6
            PHP-Code:
            foreach($xml->Lesson_Unit->learningObject as $lobject)
            $author $_POST['lobject->author']; 
            hattest du im formular ein inputfeld mit dem namen "lobject->author" ? wenn nein, wird er da nix finden, also ist das ergebnis NULL
            wenn, dann müsstest du $_POST[$lobject->author] verwenden, allerdings wissen wir nicht was du da erreichen willst ..

            nimm mal das @ bei mysql_query weg. solange du fehler nicht abfängst um sie zu bearbeiten, solltest du evtl meldungen auch nicht unterdrücken
            ps: >sending failed< ist KEINE vernünftige fehlermelden
            mfg,
            [color=#0080c0]Coragon[/color]

            Kommentar


            • #7
              hi coragon, hab das jetzt so gelöst....

              PHP-Code:
              $filename 'output_1.xml';
                 if(
              file_exists($filename)) {
                      
              $xml simplexml_load_file($filename);
                      if(
              $xml) {
                          foreach(
              $xml->Lesson_Unit->learningObject as $lobject
                          {
                  
              // Zuweisung der Elemente aus der XML Datei output_1.xml
                              
              $author $lobject->author;
                              
              $creation_date $lobject->creation_date;
                                      
              $description $lobject->description
                              
              $title $lobject->title

              /* $insert erhält als Wert die Rückgabe aus der folgenden Datenbankabfrage. In diesem Fall true oder false */
              if($insert = @mysql_query("INSERT INTO e_lesson SET author = '$author', date = '$creation_date', 
              description = '
              $description', title = '$title'")) 
              }else
              {echo 
              '<p align="center">....Succesfully....</p>';
                 die; 
              }
                 echo 
              '<p align="center">-----sending failed------</p>';
                 die;

              die Fehlermeldungen waren nur für mich als testzwecke.....

              Ich hätte da noch eine php frage....gibt es die möglichkeit simplexml als simplexml.lib (wenns die gibt...) in php4 zu includieren, oder muss ich EXPAT benutzen in PHP4????

              danke nochmals für eure antworten....bye crunny...
              bye bye crunny

              Kommentar


              • #8
                Wird nicht funktionieren, da SimpleXML intern die neuen neuen DOM-Bibliotheken benutzt und diese sehr stark auf PHP5-Features beruhen.
                "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

                Kommentar


                • #9
                  musste wieder auf expat umsteigen

                  hi an alle, danke vielmals für eure antworten.....
                  musste zwangsweise auf expat umsteigen, da meine kollegen nicht php5 benutzen....
                  versuche das gleich hier auch zu machen, quasi die elemente der xml datei an mysql zu senden.
                  hier nochmals die xml datei:
                  PHP-Code:
                  <Oberobject>
                         <
                  Object id="2" seqNumber="0">
                              <
                  title>test 2</title>
                              <
                  art>keine</art>
                              <
                  beschreibung>testversion</beschreibung>
                              <
                  notiz/>
                              <
                  autor>ich</autor>
                              <
                  datum>19.05.2005</datum>
                          </
                  Object>
                  </
                  Oberobject
                  laut dem bekannten expat script wird die xml datei in $daten gespeichert.
                  reicht jetzt hier eine foreach($daten) nicht aus???

                  PHP-Code:
                  function elem_start($xml_parser$name$attribute
                      {
                         
                  //    echo "(" . $name . ")";
                      
                  }

                      
                  //Bei Ende eines Elementes wird nur ein Zeilenumbruch ausgegeben
                      
                  function elem_ende($xml_parser$name
                      { 
                          
                  //echo "<br />";
                      
                  }
                      
                      
                  //CDATA werden direkt ausgegeben
                      
                  function cdata($xml_parser$daten
                      {
                                    echo 
                  htmlspecialchars($daten);
                      }    
                      
                  $xml_parser xml_parser_create();
                      
                  //jedes XML Element ruft ein Ereignis auf
                      
                  xml_set_element_handler($xml_parser"elem_start""elem_ende");
                      
                      
                  //CDATA erhalten einen eigenen Event_Handler
                      
                  xml_set_character_data_handler($xml_parser"cdata");
                      
                      
                  //Daten laden und Parser anstossen
                      
                  $daten file_get_contents("output.xml");
                      
                  xml_parse($xml_parser$datentrue);
                      
                      foreach(
                  $daten
                          {
                          
                  $author $elem->author;
                          
                  $creation_date $elem->creation_date;
                                  
                  $description $elem->description
                          
                  $title $elem->title

                  //$insert erhält als Wert die Rückgabe aus der folgenden Datenbankabfrage. In diesem Fall true oder false 
                          
                  if($insert = @mysql_query("INSERT INTO e_lesson SET author = '$author', date = '$creation_date', 
                          description = '
                  $description', title = '$title', zip_file = '$zip'")) 
                          { 
                              echo 
                  '<p align="center">....Succesfully....</p>';
                              die; 
                          }
                          else
                          { 
                              echo 
                  '<p align="center">-----sending failed------</p>';
                                die;
                          }
                      } */    
                      
                  //Freigabe des Parsers
                      
                  xml_parser_free($xml_parser);
                  ?> 
                  brauche HILFEEEEEEEEEEEEEEEEEEE danke gute nacht crunny...
                  bye bye crunny

                  Kommentar


                  • #10
                    sorry war schon zu spät...

                    wollt das noch ändern....
                    PHP-Code:
                    foreach($daten
                            {
                            
                    $author $_POST['$daten->author'];
                            
                    $creation_date $_POST['$daten->creation_date'];
                            
                    $description $_POST['$daten->description'];
                            
                    $title $_POST['$daten->title'];

                            
                    //$insert erhält als Wert die Rückgabe aus der folgenden Datenbankabfrage. In diesem Fall true oder false 
                            
                    if($insert = @mysql_query("INSERT INTO e_lesson SET author = '$author', date = '$creation_date', 
                            description = '
                    $description', title = '$title', zip_file = '$zip'")) 
                            { 
                                echo 
                    '<p align="center">....Succesfully....</p>';
                                die; 
                            }
                            else
                            { 
                                echo 
                    '<p align="center">-----sending failed------</p>';
                                  die;
                            }
                        } */    
                        
                    //Freigabe des Parsers
                        
                    xml_parser_free($xml_parser); 
                    geht das nicht theoretisch??? wie ginge das anders?????

                    danke im voraus...
                    bye bye crunny

                    Kommentar


                    • #11
                      komme nicht an xml attribute

                      hi an alle, hatte letztens ein problem mit dem parsen und das direkte ansprechen der attribute von xml. jetzt eigentlich ein neues, sehr ähnliches problem...

                      hier zuerst meine xml datei
                      PHP-Code:
                        <?xml version="1.0" encoding="UTF-8" ?> 
                      - <E_Lesson>
                      - <Lesson_Unit title="meine erste lesson" description="bla bla bla blabla" date="05/20/2005" author="tom">
                      - <learningObject id="2" seqNumber="0">
                        <title>test Lesson 2</title> 
                        <comments>no comments</comments> 
                        </learningObject>
                      - <learningObject id="32" seqNumber="0">
                        <title>test Lesson 32</title> 
                        <comments>scheiss comments</comments> 
                        </learningObject>
                        </Lesson_Unit>
                        </E_Lesson>
                      den expat parser hab ich bereits so angepasst, das er mir die xml datei parst. allerdings interessieren mich nicht alle character der elemente sondern nur ein ganz besonderer.

                      und zwar der knoten

                      <Lesson_Unit title="meine erste lesson" description="bla bla bla blabla" date="05/20/2005" author="tom">

                      wie komme ich an die character des knotens also title= , description=, date=, und author= ????

                      um die tags <title>, <comments> anzusprechen mach ich folgendes
                      PHP-Code:
                      $result[0][TITLE
                      aber wie komme ich an den tag <Lesson_Unit> ???

                      kann mir bitte jemand weiterhelfen???
                      bye bye crunny

                      Kommentar


                      • #12
                        guck mal in deiner funktion start_elem() auf den 3ten parameter ..
                        was siehst du ? verwendest du den parameter in der funktion, na ?
                        mfg,
                        [color=#0080c0]Coragon[/color]

                        Kommentar


                        • #13
                          hi coragon, ok hast dem recht $attrs benutze ich nie, da sind ja die sachen die ich brauch...

                          danke für deine antwort. eine frage noch. ich benutze xampp 1.4.13 mit php5. wenn ich jetzt aber wieder zurück auf php4 umsteigen will. wie mache ich das? ich möcht ja nicht xampp deinstallieren und dann neu xampp(ältere version) intallieren. weisst du das vielleicht....

                          danke bye crunny.
                          bye bye crunny

                          Kommentar


                          • #14
                            brauchst nur in der http.conf (apache)
                            nach LoadModule mod_php .. zu suchen

                            dort änderst das von php5apache(2).dll auf php4apache(2).dll

                            apache neustarten und geht schon
                            mfg,
                            [color=#0080c0]Coragon[/color]

                            Kommentar


                            • #15
                              speichern ohne nachfrage...benutze zip.lib

                              hi coragon, danke klappt wunderbar....

                              hab da mal eine frage.... ich benutze die zip.lib zum zippen...mein ziel ist es, die gezippte datei zu speichern. jedoch soll das nicht der user bestimmen wohin sondern es soll staatisch in ein ordner auf dem server gepackt werden....angehängt mal die zip.lib die ich benutze und eine andere zip bib, die ungefähr das macht was ich haben will, jedoch nur mit dateien die man im php script erstellt....der aufruf der anderen zip bib sieht folgendermassen aus....
                              PHP-Code:
                              require('zip.lib2.php');

                              $zipfile = new zipfile();  

                              // add the subdirectory ... important!
                              $zipfile -> add_dir("e_lesson/");

                              // add the binary data stored in the string 'filedata'
                              $filedata "(read your file into $filedata)";  
                              $zipfile -> add_file($filedata"e_lesson/file.txt");  

                              // the next three lines force an immediate download of the zip file:
                              header("Content-type: application/octet-stream");  
                              header("Content-disposition: attachment; filename=test.zip");  
                              echo 
                              $zipfile -> file(); 
                              also kurz nochmal mein ziel...wenn ein SAVE button gedrückt wird soll im hintergrund die gezippte datei enstehen und in ein ordner gespeichert werden.....ohne diese vom user anzuforodern...
                              geht das??? wäre klasse wenn du mir da input geben könntest...

                              danke im voraus bye crunny..
                              Angehängte Dateien
                              bye bye crunny

                              Kommentar

                              Lädt...
                              X