Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Probleme beim Parsen einer XML-Datei

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Probleme beim Parsen einer XML-Datei

    Hallo,

    bin gerade dabei eine XML-Datei zu parsen, finde aber nicht die richtige Vorgehensweise. Habe auch noch nie XML geparst, aber mich schon mal mit den Grundlagen beschäftigt.

    Ich versuche mal das Problem zu beschreiben. Die XML-Datei besteht im Wesentlichen aus Objekten die durch ein "struct" beschrieben werden. Jedes struct enthält dabei lauter "member" die wiederum „name“ und „value“ Elemente beinhalten.

    Nun habe ich mit dem XMLReader die Elemente iteriert und nach structs gesucht. Wurde ein struct gefunden, so habe ich mit dem DOM weitergemacht um aus dem struct die Daten auszulesen. Hat auch wunderbar geklappt. Nun habe ich ein XML-Dokument mit verschachtelten structs. Es kommt also vor, dass ein value Element selbst ein struct enthält. Und jetzt komme ich mit meiner Strategie nicht mehr weiter. Ich muss ja irgendwie unterscheiden können, ob es sich nun um ein inneres struct handelt, oder nicht.

    Ist ein wenig schwer zu erklären, ohne es zu zeigen.
    Hier ist noch ein Code-Auszug:

    PHP-Code:

    while ( $this->reader->read() ) {   
                 
              if ( 
    $this->reader->name == "struct" && 
                                
    $this->reader->nodeType == XMLReader::ELEMENT ) {    
                  
                  
                  
    /* struct gefunden, DOM-Object aus der Node machen */
                  
    $DOMNode   $this->reader->expand();

                  
    // ...

    Und die XML-Datei die geparst werden soll.

    Code:
     <struct>
      <member><name>data</name>
      <value><string>data</string></value>
      </member>
      <member><name>data</name>
      <value><int>data</int></value>
      </member>
      <member><name>data</name>
      <value>
       <struct>
        <member><name>data</name>
        <value><string>data</string></value>
        </member>
        <member><name>data</name>
        <value><string>data</string></value>
        </member>
      </struct>
     </value>
     </member>
    </struct>
    Hat jemand eine Idee? Vielleicht auch ne ganz andere Vorgehensweise? Hauptsache ich komme an die Daten.

    Danke und Gruß
    unit1

  • #2
    Hallo unit1,

    zunächst ein Herzliches Willkommen im Forum!

    Frage: was steckt in $this->reader?
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design [B]before[/B] you start to write code!
    2. Discuss and review it together with [B]experts[/B]!
    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
    4. Write [I][B]clean and reusable[/B][/I] software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Zitat von dr.e.-new Beitrag anzeigen
      Hallo unit1,

      zunächst ein Herzliches Willkommen im Forum!

      Frage: was steckt in $this->reader?
      Hallo,

      danke erstmal für die Antwort.

      reader ist mein XMLReader. Ihm wird ein ein XML-String übergeben, dass habe ich mal im Code-Ausschnitt weggelassen.

      PHP-Code:
       $this->reader = new XMLReader(); 

      Kommentar


      • #4
        Hallo unit1,

        ein Logik Vorschlag von mir:

        Finde alle struct-Elemente.
        Hat das Element mehr als ein Kind?
        Wenn ja, rufe Funktion rekursiv erneut auf.
        Wenn nein, selektiere Kind-Element.
        [FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
        — The best things in life aren't things[/FONT]

        Kommentar


        • #5
          Ist die XML Datei sehr groß, so dass Du auf den Hybrid-Ansatz angewiesen bist?

          Kommentar


          • #6
            Zitat von David Beitrag anzeigen
            Ist die XML Datei sehr groß, so dass Du auf den Hybrid-Ansatz angewiesen bist?
            Also für DOM allein, oder SimpleXML ist sie definitiv zu groß. Sind bis zu tausend Objekte die geparst werden müssen. Und ja, das war eigentlich auch meine Frage, ob ich das irgendwie anders lösen kann. Sprich mit dem XMLReader allein zum Beispiel.

            Naja, ich habe es jetzt so ähnlich gelöst wie es phpdummi-new vorgeschlagen hat. Kinderelemente zählen, falls inneres struct, dann die while schleife mit continue verlassen, falls äußeres struct, dann daten extrahieren.

            Ist zwar nicht optimal, aber es geht.
            Danke und Gruß

            Kommentar

            Lädt...
            X