XML mit PHP auslesen -> Problem mit doppeltem foreach()

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

  • XML mit PHP auslesen -> Problem mit doppeltem foreach()

    Hallo Zusammen, ich brauche dringend Hilfe!

    Habe ein XML File welches ich als String in einer Variable gespeichert habe und möchte das mit PHP so verarbeiten, dass ich es sauber in einer DB speichern kann.

    Dazu habe ich folgende Funktion geschrieben:

    PHP-Code:
    function instantiate_tp_from_xml($xml_string)
    {
      
    $levelCounter               0;
      
    $stepCounter     0;
      
    $xml_object     simplexml_load_string$xml_string);
        
    foreach (
    $xml_object as $step)
    {
      if (
    $levelCounter==)     // 1st-level information = name of tp  
      
    {
        echo 
    $xml_object->NAME."<br>";
      }
      elseif (
    $levelCounter==1// 2nd-level information = description
      
    {
        echo 
    $xml_object->DESCRIPTION."<br>";
      }
      else  
    // all other levels are STEPS    
      
    {
        echo 
    $xml_object->STEP[$stepCounter]->NAME."<br>";
        echo 
    $xml_object->STEP[$stepCounter]->DESCRIPTION."<br>";
        echo 
    $xml_object->STEP[$stepCounter]->FLOWNAME."<br>";

        
    $conditionCounter 0;
       
        
    // give me your conditions
       
    foreach ($xml_object->STEP[$stepCounter]->CONDITION as $condition)              
       {
          echo 
    $xml_object->STEP[$stepCounter]->CONDITION
          $conditionCounter
    ]->OBSERVATIONSTEP."<br>";

          echo 
    $xml_object->STEP[$stepCounter]->CONDITION        
          
    [$conditionCounter]->ORDER."<br>";

          
    $conditionCounter++;
         }
         
    $stepCounter++;
      }
    }
    $levelCounter++;

    Hier noch ein Blick auf das XML. Das XML wird dynamisch erzeugt und kann beliebig viele STEPS mit beliebig vielen CONDITIONS besitzen:

    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <TESTPROCESS>
        
        <NAME>Test1</NAME>
        <DESCRIPTION>Description1</DESCRIPTION>
      
      <STEP>
              <NAME>StepName1</NAME>
              <DESCRIPTION>StepDescription1</DESCRIPTION>
              <FLOWNAME>StepFlowname1</FLOWNAME>
              <STEPNAME>StepStepname1</STEPNAME>
              <OPCODE>StepOpcode1</OPCODE>
              <DIRECTION>StepDirection1</DIRECTION>
        
             <CONDITION>
               <OBSERVATIONSTEP>dgdgdg2</OBSERVATIONSTEP>
               <FCTCONDITION>Condition02</FCTCONDITION>
               <VALUE>ConditionValue2</VALUE>
               <ORDER>2</ORDER>
             </CONDITION>    
      </STEP>
    
      <STEP>
              <NAME>StepName1</NAME>
              <DESCRIPTION>StepDescription1</DESCRIPTION>
              <FLOWNAME>StepFlowname1</FLOWNAME>
              <STEPNAME>StepStepname1</STEPNAME>
              <OPCODE>StepOpcode1</OPCODE>
              <DIRECTION>StepDirection1</DIRECTION>
              
             <CONDITION>
               <OBSERVATIONSTEP>dgdgdg</OBSERVATIONSTEP>
               <FCTCONDITION>Condition01</FCTCONDITION>
               <VALUE>ConditionValue01</VALUE>
               <ORDER>1</ORDER>
             </CONDITION>
    
              <CONDITION>
               <OBSERVATIONSTEP>dgdgdg</OBSERVATIONSTEP>
               <FCTCONDITION>Condition01</FCTCONDITION>
               <VALUE>ConditionValue01</VALUE>
               <ORDER>1</ORDER>
             </CONDITION>
    
             <CONDITION>
               <OBSERVATIONSTEP>dgdgdg3</OBSERVATIONSTEP>
               <FCTCONDITION>Condition03</FCTCONDITION>
               <VALUE>ConditionValue03</VALUE>
               <ORDER>3</ORDER>
             </CONDITION>
      </STEP>
    </TESTPROCESS>
    !!! Jetzt mein Problem: Wenn ich dsämtlichen Inhalt innerhalb der Schlaufe
    PHP-Code:
    foreach ($xml_object as $step
    ausklammere, wird die Schlaufe 4 mal durchloffen (Einmal für Name, einmal für Description und je einmal für die beiden Steps). Da ich nun mit der zweiten foreach Schlaufe die jeweiligen CONDITIONS der STEPS ausgeben will kommt es zum Problem. Die Condition zu den jeweiligen steps werden zwar richtig ausgegeben, jedoch wird die Hauptschlaufe nicht mehr 4 sondern 5mal durchloffen, was natürlich zu einem Fehler führt.

    Kann mir jemand sagen warum die Haupt-Foreach Schlaufe plötzlich zu oft durchlaufen wird? Wie kann ich das lösen?

    Wer kann mir helfen, ist echt dringend und ich weiss nicht mehr weiter!!! Liebe Grüsse aus der Schweiz!

    Vielen Dank !!!

  • #2
    XML mit PHP auslesen -&gt; Problem mit doppeltem foreach()

    Hallo Zusammen!

    Habe ein XML File welches ich als String in einer Variable gespeichert habe und möchte das mit PHP so verarbeiten, dass ich es sauber in einer DB speichern kann.

    Dazu habe ich folgende Funktion geschrieben:

    PHP-Code:
    function instantiate_tp_from_xml($xml_string)
    {
      
    $levelCounter               0;
      
    $stepCounter     0;
      
    $xml_object     simplexml_load_string$xml_string);
        
    foreach (
    $xml_object as $step)
    {
      if (
    $levelCounter==)     // 1st-level information = name of tp  
      
    {
        echo 
    $xml_object->NAME."<br>";
      }
      elseif (
    $levelCounter==1// 2nd-level information = description
      
    {
        echo 
    $xml_object->DESCRIPTION."<br>";
      }
      else  
    // all other levels are STEPS    
      
    {
        echo 
    $xml_object->STEP[$stepCounter]->NAME."<br>";
        echo 
    $xml_object->STEP[$stepCounter]->DESCRIPTION."<br>";
        echo 
    $xml_object->STEP[$stepCounter]->FLOWNAME."<br>";

        
    $conditionCounter 0;
       
        
    // give me your conditions
       
    foreach ($xml_object->STEP[$stepCounter]->CONDITION as $condition)              
       {
          echo 
    $xml_object->STEP[$stepCounter]->CONDITION
          $conditionCounter
    ]->OBSERVATIONSTEP."<br>";

          echo 
    $xml_object->STEP[$stepCounter]->CONDITION        
          
    [$conditionCounter]->ORDER."<br>";

          
    $conditionCounter++;
         }
         
    $stepCounter++;
      }
    }
    $levelCounter++;

    Hier noch ein Blick auf das XML. Das XML wird dynamisch erzeugt und kann beliebig viele STEPS mit beliebig vielen CONDITIONS besitzen:

    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <TESTPROCESS>
        
        <NAME>Test1</NAME>
        <DESCRIPTION>Description1</DESCRIPTION>
      
      <STEP>
              <NAME>StepName1</NAME>
              <DESCRIPTION>StepDescription1</DESCRIPTION>
              <FLOWNAME>StepFlowname1</FLOWNAME>
              <STEPNAME>StepStepname1</STEPNAME>
              <OPCODE>StepOpcode1</OPCODE>
              <DIRECTION>StepDirection1</DIRECTION>
        
             <CONDITION>
               <OBSERVATIONSTEP>dgdgdg2</OBSERVATIONSTEP>
               <FCTCONDITION>Condition02</FCTCONDITION>
               <VALUE>ConditionValue2</VALUE>
               <ORDER>2</ORDER>
             </CONDITION>    
      </STEP>
    
      <STEP>
              <NAME>StepName1</NAME>
              <DESCRIPTION>StepDescription1</DESCRIPTION>
              <FLOWNAME>StepFlowname1</FLOWNAME>
              <STEPNAME>StepStepname1</STEPNAME>
              <OPCODE>StepOpcode1</OPCODE>
              <DIRECTION>StepDirection1</DIRECTION>
              
             <CONDITION>
               <OBSERVATIONSTEP>dgdgdg</OBSERVATIONSTEP>
               <FCTCONDITION>Condition01</FCTCONDITION>
               <VALUE>ConditionValue01</VALUE>
               <ORDER>1</ORDER>
             </CONDITION>
    
              <CONDITION>
               <OBSERVATIONSTEP>dgdgdg</OBSERVATIONSTEP>
               <FCTCONDITION>Condition01</FCTCONDITION>
               <VALUE>ConditionValue01</VALUE>
               <ORDER>1</ORDER>
             </CONDITION>
    
             <CONDITION>
               <OBSERVATIONSTEP>dgdgdg3</OBSERVATIONSTEP>
               <FCTCONDITION>Condition03</FCTCONDITION>
               <VALUE>ConditionValue03</VALUE>
               <ORDER>3</ORDER>
             </CONDITION>
      </STEP>
    </TESTPROCESS>
    !!! Jetzt mein Problem: Wenn ich dsämtlichen Inhalt innerhalb der Schlaufe
    PHP-Code:
    foreach ($xml_object as $step
    ausklammere, wird die Schlaufe 4 mal durchloffen (Einmal für Name, einmal für Description und je einmal für die beiden Steps). Da ich nun mit der zweiten foreach Schlaufe die jeweiligen CONDITIONS der STEPS ausgeben will kommt es zum Problem. Die Condition zu den jeweiligen steps werden zwar richtig ausgegeben, jedoch wird die Hauptschlaufe nicht mehr 4 sondern 5mal durchloffen, was natürlich zu einem Fehler führt.

    Kann mir jemand sagen warum die Haupt-Foreach Schlaufe plötzlich zu oft durchlaufen wird? Wie kann ich das lösen?

    Liebe Grüsse aus der Schweiz!

    Vielen Dank !!!
    Zuletzt geändert von san3000; 01.09.2006, 15:13.

    Kommentar


    • #3
      Hallo Zusammen, ich brauche dringend Hilfe!
      schau mal hier. Das Problem (deines Kunden) muss hier genauso lange warten, wie alle anderen Probleme auch.
      Zuletzt geändert von TobiaZ; 01.09.2006, 15:13.

      Kommentar


      • #4
        danke!

        Kommentar


        • #5
          Und Crosspostings entsprechen auch nicht gerade der Netiquette. *zusammenführ*

          Kommentar


          • #6
            Ich sehe da ein relative einsames $levelCounter++ am Ende ... außerhalb der äußeren Schleife.
            PHP-Code:
            $levelCounter 0;
            foreach () {
              if (
            $levelCounter==0) {}
              elseif (
            $levelCounter==1) {}
              else {
                  foreach () {}
              }
            }
            $levelCounter++; 
            Da wundert es mich, dass es überhaupt funktioniert ...

            Kommentar


            • #7
              ja sieht hier nicht gut aus habe es in meinem script aber nach der letzten if geschlossen klammer bevor ich das erste foreach schliesse. ist das nicht ok?
              Angehängte Dateien

              Kommentar


              • #8
                Okay, in dem Screenshot stimmts.
                Dann wirds Zeit für Kontrollausgaben: Lass dir alle für die Schleifen relevaten Variablen ausgeben und finde heraus, wann welcher if-else-Zweig betreten wird. Kann ja nicht so schwer zu finden sein ...

                Kommentar


                • #9
                  habe ich alles schon gemacht.. wenn ich die zweite foreach schlaufe raus nehme läufts wie geschmiert...

                  Kommentar


                  • #10
                    Bau doch mal echo's an allen neuralgischen Stellen ein! Irgendwas muß doch dann an der Ausgabe zu sehen sein ...

                    Kommentar


                    • #11
                      ja man sieht einfach dass er alles wie gewollt ausgiebt. bis er dann die schlaufe ein fünftes mal durchgeht und dann auf die fresse fliegt weil er dann natürlich kein gültiges objekt ansprechen versucht....

                      Kommentar


                      • #12
                        es muss etwas mit der zweiten foreach schlaufe zu tun haben!
                        wie könnte ich zum beispiel die unterelemente (conditions) zählen, damit ich anstelle der zweiten foreach schlaufe eine while oder for machen könnte?

                        Kommentar


                        • #13
                          Zählen sollte mit count() funktionieren.
                          Aber bist du dir sicher, dass da ein Schleifendurchlauf zuviel stattfindet? Kann es nicht sein, dass du das nur glaubst, weil du zweimal die selben Daten zu STEP ausgegeben bekommst? Das liegt schlicht daran, dass beide Steps den selben Namen, Description usw. haben.

                          Kommentar


                          • #14
                            Vielen Dank für Deine Hilfe habs tatsächlich geschaft mit count()

                            PHP-Code:
                            $countConditions count($xml_object->STEP[$stepCounter]->CONDITION);
                                         
                                         for (
                            $yxz=0$yxz $countConditions$yxz++)
                                         {
                                             echo 
                            "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$xml_object->STEP[$stepCounter]->CONDITION[$conditionCounter]->OBSERVATIONSTEP."<br>";
                                             echo 
                            "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$xml_object->STEP[$stepCounter]->CONDITION[$conditionCounter]->ORDER."<br>";
                                             
                            $conditionCounter++;
                                         } 
                            Vielen Dank!!!
                            Zuletzt geändert von san3000; 01.09.2006, 16:27.

                            Kommentar

                            Lädt...
                            X