XML Infos definiert auslesen

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

  • XML Infos definiert auslesen

    Hallo zusammen,

    eine kleine Detailfrage zum Thema XML auslesen.

    Ich möchte aus auf einem Server bereitgestellen Dokumenten nur Meldungen auf meiner Website darstellen, die unter code codetype thema nur T/AAA oder T/DDD enthalten. Der Ausschnitt aus dem XML sieht wie folgt aus:

    <codes codetype="region">D/EU,US/AM,R/AS,K/AF</codes>
    <codes codetype="land">D/DEU,E/ENG,O/OEST</codes>
    <codes codetype="thema">T/AAA,T/BBB,T/CCC,T/DDD,I/FFF</codes>

    Ich hab dies mit dem Befehl:

    if(!preg_match('/<codes codetype=\'thema\'>T/AAA, T/DDD(.+?)<\/codes>/is',$xml,$arr)) continue;
    $time = $arr[1];

    versucht. Funktioniert aber leider (noch) nicht.

    Kann mir hier jemand bei diesem Detail weiterhelfen?

    Schon vorab vielen Dank.

    Jo

  • #2
    Erstmal verwendest du bitte Code-Tags!

    Dann schaust du dir die DOM Klassen von PHP an, mit denen du wesentlich bequemer an einzelne Tags rankommst und somit später nur auf den Text-Inhalt matchen musst, statt XML-Syntax zu berücksichtigen!
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      Danke für die Rückinfo.

      Wie sieht dies aber konkret aus, da ich ja bereits alle Meldungen korrekt abrufen und darstellen kann, ich nun aber aus allen Meldungen nur gewisse (die mit thema T/AAA und T/DDD) selektieren und darstellen möchte?

      Die Lösung basiert derzeit bereits auf:

      PHP-Code:
      if(!preg_match('/<codes codetype=\'thema\'>T/AAA, T/DDD(.+?)<\/codes>/is',$xml,$arr)) continue;
      $time $arr[1]; 
      Nur das spezielle Selektieren funktioniert halt noch nicht.

      Wäre schön hierbei Hilfe zu bekommen.

      Jo

      Kommentar


      • #4
        Das ganze konkret zu machen, dafür bist du da. Wir geben dir nur die Hinweise, wie es geht.

        unset sagte ja bereits, dass du dir mal die DOM-Klassen (suchen) von PHP ansehen sollst.

        Also, XML-Datei parsen (suchen), dann hast du schonmal ein Objekt, dass du dann "durchlaufen" kannst.

        Für jeden Datensatz suchst du dir dann die codex-elemente raus und filterst dann noch die mit dem entsprechenden Attribut raus.

        Letztendlich ist es dann nur noch ein simples preg_match oder eine Stringsuche um zu entscheiden, ob der aktuelle Datensatz ausgegeben wird oder nicht.

        OffTopic:
        ich hab jetzt wahrscheinlich mehr geschrieben, als wenn ich dir den fertigen quelltext gegeben hätte, aber so lernst du mehr.

        Kommentar


        • #5
          Für jeden Datensatz suchst du dir dann die codex-elemente raus und filterst dann noch die mit dem entsprechenden Attribut raus.
          ...genau um dies geht es.
          Wie ja gesagt läuft der Script bereits, das parsen war erfolgreich und ich habe mit preg_match den Script funktionsfähig aufgebaut. Mir geht es hier nicht um eine Gesamtlösung, nur dass das selektieren irgendwie nicht klappen will und ich den potentiellen Fehler in:

          PHP-Code:
          if(!preg_match('/<codes codetype=\'thema\'>T/AAA, T/DDD(.+?)<\/codes>/is',$xml,$arr)) continue;
          $time $arr[1]; 
          nicht erkenne. Hierzu suche ich support.

          Gruß

          Jo

          Kommentar


          • #6
            Das mit preg_match zu machen ist quatsch, wenn du doch schon bequeme XML bzw DOM Klassen zur Verfügung hast. Jetzt schau dir das doch mal endlich an.
            [FONT="Helvetica"]twitter.com/unset[/FONT]

            Shitstorm Podcast – Wöchentliches Auskotzen

            Kommentar


            • #7
              Vergleich doch mal das rohe XML mit dem was du als regulären Ausdruck verwendest!
              Code:
              <codes codetype="thema">T/AAA,T/BBB,T/CCC,T/DDD,I/FFF</codes>
              <codes codetype=\'thema\'>T/AAA, T/DDD(.+?)<\/codes>
              Der Ausdruck matcht nur, wenn thema von ' umschlossen ist. Ist es aber nicht. Es sind ".
              Und er matcht nur, wenn T/AAA und T/DDD direkt aufeinanderfolgen. Tun sie aber nicht.
              Und vor allem verwendest du / als Delimiter des gesamten Ausdrucks, hast aber die Slashes in T/XXX nicht maskiert. Deswegen kann preg_match mit dem Ausdruck überhaupt nichts anfangen.

              Kommentar


              • #8
                Wie ja gesagt läuft der Script bereits, das parsen war erfolgreich und ich habe mit preg_match den Script funktionsfähig aufgebaut. Mir geht es hier nicht um eine Gesamtlösung, nur dass das selektieren irgendwie nicht klappen will
                Die Erfahrung hat gezeigt, dass die meisten User nach der empfohlenen Umsetzung besser gefahren sind.

                Dies hätte auch dein Problem minimiert.

                Wenn entweder der eine String, oder der andere vorkommen soll, dann drück das auch so aus:

                (T/AAA|T/DDD)

                Der RegExp-Evaluator - RegExp-Tutorial - Metazeichen

                Escapen natürlich nicht vergessen

                Kommentar


                • #9
                  Danke für die Tipps, dazu zwei Anmerkungen.

                  Nach meiner Meinung können auch " mit ' dargestellt werden. Dies funktioniert ja auch in meinem Script, obwohl in der XML-Datei die " anstatt ' vorhanden sind.
                  Darüber hinaus habe ich gedacht, dass ein normaler Slash in (T/AAA|T/DDD) nicht zu maskieren ist, oder?

                  Ich habe nun Eure Hinweise wie folgt integriert:

                  PHP-Code:
                  if(!preg_match('/<codes codetype=\'thema\'\'(T/AAA|T/DDD)\'>(.+?)<\/codes>/is',$xml,$arr)) continue; 
                  aber danach die Fehlermeldung:

                  Warning: preg_match() [function.preg-match]: Unknown modifier 'A' in ...
                  oder bei einer Modifikation von / bzw. ' auch:
                  Warning: preg_match() [function.preg-match]: Unknown modifier '(' in ...
                  oder auch:
                  Warning: preg_match() [function.preg-match]: Unknown modifier '|' in ...
                  erhalten.

                  Irgendwas läuft bei der Aneinanderreihung von thema T/AAA und T/DDD falsch, oder?

                  Gruß

                  Jo

                  Kommentar


                  • #10
                    Nach meiner Meinung können auch " mit ' dargestellt werden. Dies funktioniert ja auch in meinem Script, obwohl in der XML-Datei die " anstatt ' vorhanden sind.
                    Dein Script funktioniert doch gar nicht. Oder redest du von etwas anderem, von dem wir keine Kenntnis besitzen?

                    Darüber hinaus habe ich gedacht, dass ein normaler Slash in (T/AAA|T/DDD) nicht zu maskieren ist, oder?
                    Ist falsch. Und zu dem Zeitpunkt gab es noch gar keine Klammern.

                    Warning: preg_match() [function.preg-match]: Unknown modifier 'A' in ...
                    Womit wir wieder beim Thema Delimiter wären, bzw. Escapen. Hast unsere Hinweise also noch nicht befolgt.

                    Irgendwas läuft bei der Aneinanderreihung von thema T/AAA und T/DDD falsch, oder?
                    Japp, den Hinweis haben wir dir aber schon (mehrfach) gegeben. (siehe auch Punkt 3)

                    Kommentar


                    • #11
                      Das Thema Delimiter/Escapen mit hinten und vorne angeordneten Backslash (-> /begriff/) ist mir eigentlich schon klar, so habe ich es ja auch gemacht.

                      Aber vielleicht reden wir wirklich ein bisschen aneinander vorbei.

                      Also nochmal:

                      Eine der Beispiel Meldung in XML:

                      </ElementType>
                      <ElementType name="version" content="textOnly" model="closed" dt:type="number" />
                      <ElementType name="uniqueid" content="textOnly" model="closed" dt:type="string" />
                      <ElementType name="titel" content="textOnly" model="closed" dt:type="string" />
                      <ElementType name="codes" content="mixed" model="closed">
                      <AttributeType name="codetype" dt:type="enumeration" dt:values="region land thema" />
                      <attribute type="codetype" required="yes" />
                      </ElementType>
                      <version>1.0</version>
                      <uniqueid>1234567</uniqueid>
                      <titel>bla, bla</titel>
                      <codes codetype="region">D/EU,US/AM,R/AS,K/AF</codes>
                      <codes codetype="land">D/DEU,E/ENG,O/OEST</codes>
                      <codes codetype="thema">T/AAA,T/BBB,T/CCC,T/DDD,I/FFF</codes>

                      so, nun stelle ich derzeit alle Meldungen wie folgt dar, was auch funktioniert:

                      PHP-Code:
                      if(!preg_match('/<titel>(.+?)<\/titel>/is',$xml,$arr)) continue;
                      $time $arr[1]; 
                      Nun möchte ich aber weiter einschränken und nur die Meldungen darstellen, welche den codetype thema und hier nur T/AAA und T/DDD haben.

                      Hier genau habe ich das Problem, um die drei genannten Begriffe wie bereits oben geschildert zu selektieren.

                      Ich hoffe dies konnte ein wenig zur Klärung meiner Fragestellung beitragen.

                      Gruß

                      Jo

                      Kommentar


                      • #12
                        Das Thema Delimiter/Escapen mit hinten und vorne angeordneten Backslash (-> /begriff/) ist mir eigentlich schon klar, so habe ich es ja auch gemacht.
                        Das stimmt doch nicht. Du verwendest den Delimiter / und gleichzeitig verwendest du / ohne sie zu escapen.

                        Eine der Beispiel Meldung in XML:
                        Ohne deinen Vollständigen Code zu kennen, vermute ich, dass das was du hast noch lange nicht reicht um das gewollte Ziel zu erreichen.

                        Hier genau habe ich das Problem, um die drei genannten Begriffe wie bereits oben geschildert zu selektieren.
                        Ja, hast du. Nur die eigenen Lösungsansätze fehlen noch. Du zeigst uns, welcher Code funktioniert. Nicht aber, was nicht funktioniert.

                        Jetzt gib uns bitte noch mal den Beispielcode von $xml (außer es ist der gerade gepostete) und natürlich auch deinen aktuellen PHP/RegEx versuch.
                        Bitte mit mit Ist- und Soll-Ergebnis.

                        Kommentar


                        • #13
                          PHP-Code:
                          if(!preg_match('<codes codetype=\"thema\">T\/AAA,T\/DDD(.+?)</codes>/is',$xml,$arr)) continue;
                          $time $arr[1]; 
                          ...sieht das nun besser aus? Geht dies in die richtige Richtung?

                          Trotzdem kommt die Fehlermeldung:

                          Warning: preg_match() [function.preg-match]: Unknown modifier 'I' in

                          was ich gar nicht verstehe?!?

                          Gruß

                          Jo

                          Kommentar


                          • #14
                            Da kein großes I vorhanden ist, verstehe ichs auch nicht. Ich würde aber auf den ersten Blick noch mindestens ein weiteres / sehen, das nicht escaped wurde.

                            Und nochmal: Was steht in $xml drin?

                            Aber mir kommt es gerade so vor, als ob du eher Rückschritte machst. Wo sind die Klammern nun schon wieder hin? Versuch doch bitte mal alles was hier gesagt wurde, zu konsolidieren. Am besten in Form einer Checkliste. Und dann gibst du uns noch mal die Gesamtübersicht. Input, Code, Output und gewünschter Output.

                            Raten mag hier niemand.
                            Zuletzt geändert von TobiaZ; 29.12.2009, 23:32.

                            Kommentar


                            • #15
                              gesamtheitlich sieht es nun so aus:

                              PHP-Code:
                              $xml join(file($arrFTPXML['path'].$f));

                              if(!
                              preg_match('/<titel>(.+?)<\/titel>/is',$xml,$arr)) continue;
                              if(!
                              preg_match('<codes codetype=\"thema\">T\/AAA,T\/DDD(.+?)</codes>/is',$xml,$arr)) continue;
                              $time $arr[1]; 
                              Warum geht es in die falsche Richtung. Ich denke, dass Delimiter und Escapen nun korrekt ist.

                              Nur der Fehler mit 'I' ist sehr komisch?!?

                              Gruß

                              Jo

                              Kommentar

                              Lädt...
                              X