Ankündigung

Einklappen
Keine Ankündigung bisher.

XML mit mehreren gleichen Feldnamen gezielt auslesen

Einklappen

Neue Werbung 2019

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

  • #16
    Die XML im Startbeitrag ist invalide. Aber so würde ich das lösen:

    PHP-Code:
    $xml = <<<'XML'
    <?xml version="1.0" encoding="utf-8"?>
    <source>
        <anlagen>
            <anlage>
                <text_modules>
                    <modul_header>
                        Werbung
                    </modul_header>
                    <modul_text>
                        Uninteressant
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Aufgaben
                    </modul_header>
                    <modul_text>
                        Interessant
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Daten
                    </modul_header>
                    <modul_text>
                        Interessant
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Angebot
                    </modul_header>
                    <modul_text>
                        Interessant
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Bewertung
                    </modul_header>
                    <modul_text>
                        Unteressant
                    </modul_text>
                </text_modules>
            </anlage>
        </anlagen>
    </source>
    XML;
            
    # DOM
    $dom = new DOMDocument('1.0', 'utf-8');
    $dom->loadXML($xml);

    # XPATH
    $xpath = new DOMXpath($dom);

    # Anfragen aller text_modules unterknoten modul_header dessen nachbarknoten modul_text normalisiert 'Interessant' ist
    $result = $xpath->query("anlagen/anlage/text_modules[normalize-space(modul_text) = 'Interessant']/modul_header");

    # Knoten normalisieren und zu String konvertieren.
    $data = array_map(function(DOMNode $node) {
        return trim($node->nodeValue);
    }, iterator_to_array($result));
            
    var_dump(
        $data
    );
    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

    Kommentar


    • #17
      Ich muss mehrere verschiedenen xml Dateien einlesen die für DOM zu groß wären. Außerdem möchte ich ungern ein, bis auf ein Detail, funktionierendes Verfahren jetzt noch umwerfen. Aber danke dir für deinen Beitrag

      Kommentar


      • #18
        Folgendes funktioniert:
        Code:
        	foreach ($anlagen as $datum_sort) {
        		foreach ($datum_sort as $anlage) {
        			foreach ($anlage->text_modules as $inhalt) {
        				echo $inhalt->modul_text;
        				echo "<br>";
        			}
        			echo "<br>";
        		}
        	}
        und folgendes, was ich brauche. Funktioniert nicht:
        Code:
        	foreach ($anlagen as $datum_sort) {
        		foreach ($datum_sort as $anlage) {
        			foreach ($anlage->text_modules as $inhalt) {
        				$inhalt_array[]=$inhalt->modul_text;
        			}
        //hier sollte der Inhalt an eine Funktion weitergegeben werden
        			echo $inhalt_array[1];
        		}
        	}
        Da kommt als Ergebnis:
        Interessant
        Interessant

        Statt:
        Interessant
        Interessant2

        Benutzer wird das xml in #13. Anscheinend muss das Array vorher gelöscht werden.

        EDIT: mit unset($inhalt_array) nachdem ich den Inhalt an eine Funktion weitergeben habe, klappts. Juhuuu

        Kommentar


        • #19
          Zitat von brimborium Beitrag anzeigen
          Ich muss mehrere verschiedenen xml Dateien einlesen die für DOM zu groß wären. Außerdem möchte ich ungern ein, bis auf ein Detail, funktionierendes Verfahren jetzt noch umwerfen. Aber danke dir für deinen Beitrag
          Und genau dafür gibt es XSLT und/oder XINCLUDE. Damit joinst du unterknoten mehrerer XML-Dateien zu einem Dokument das nur die Daten enthält die du brauchst.

          DOMDocument kann Dateien jeder Größe öffnen, nur das PHP Memory-Limit und der zur Verfügung stehende Physikalische RAM-Speicher begrenzen das.

          Hast du also 1 Terabyte Arbeitsspeicher kann deine XML ca. 625 GB ( ca 5/8 dieses Speichers ) haben. ( XML Knoten-Objekte enthalten Metadaten die das ganze etwas aufblähen )
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #20
            Ich fand das xslt Beispiel ziemlich kompliziert. Da gabs dann irgendwie auch xslt Dateien. Erschien mir umständlicher. Aber ich habs auch nicht wirklich verstanden

            Kommentar


            • #21
              Um was gehts denn genau ? ( Was ist dein primäres Ziel ? )
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #22
                Nun ich hab mehrere xmls (aber das ist egal), und ich muss deren Inhalte die mich interessieren, sammeln und dann formatiert ausgeben. Ich sammle die Daten und reiche sie dann an eine Funktion weiter die die Daten formatiert und in einer Liste über mehrere Seiten ausgibt.

                Kommentar


                • #23
                  Dann hier der Hinweis, das Sammeln der Daten kann XSLT. Pagination kann auch via XSLT realisiert werden. Was du in PHP dafür tun musst ist zwei DOMDocument- und eine XSLTProcessor-Instanz anlegen, sie verknüpfen, eine Function erzeugen die die aktuelle Seite identifiziert und diese am XSLTProcessor registrieren. Dokument ausgeben, fertig.

                  Dafür müsstest du dir das ein oder andere über XSLT, XPATH und DOM aneignen. Eine wirklich schwere Aufgabe ist das nicht, wenn du DOM und XML einmal verstanden hast. Allemal performanter als das Gefriemel mit Schleifen in PHP wird das auf jedenfall.
                  [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                  Kommentar


                  • #24
                    Verstehe, aber da ich mir schon die ganze Arbeit mit den Schleifen und der Pagination gemacht habe und das läuft, möchte ich das jetzt nicht wieder umwerfen. Hat zuviel Arbeit gekostet

                    Das Problem war jetzt nur, dass ein neues xml dazukam, dessen Struktur eine andere war.

                    Kommentar


                    • #25
                      Na dann viel Spass.

                      Auch wenn ich jetzt schon ahne das du für jede weitere XML eine weitere Schleife nutzen wirst. Was auch grundlegend kürzer geht. Ich erörtere hier nur was am meisten Performance bringt, da du das ganze ja noch irgendwo Darstellen willst ohne das sich das Script zu Tode wühlt.
                      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                      Kommentar


                      • #26
                        Performant isses, abgesehen vom Abrufen der XMLs.

                        Und ja, man könnte es sicher noch schöner und besser machen, aber meist wird man für saubere Arbeit nicht bezahlt, sondern für schnelle. Für freiwillige (auch unfreiwillige) Aktionen fehlt mir gerade die Zeit :/

                        Ich danke euch jedenfalls immens für eure Hilfe

                        Stand gestern bisschen aufm Schlauch :/ War wohl etwas zu spät

                        Kommentar


                        • #27
                          Zitat von brimborium Beitrag anzeigen
                          Ich verstehe mein Problem ja leider auch nicht
                          Hier liegt wohl der Grund des Übels. Wer sein Problem noch nicht voll erfaßt hat, kann es auch schlecht darlegen.
                          Dazu noch Code, der nicht dem Orginal entspricht, da ist schwer zu helfen.

                          Da nix besseres da ist halte ich mich mal an die XML aus #13.
                          Dort wo du Interessant reingeschrieben hast steht ja in der Realität ein anderer (unbekannter) Inhalt.
                          Du benötigst also eine weitere Information, welche dich zu einer Entscheidung Interessant oder Uninteressant befähigt.
                          Wo du diese Information herzauberst, ist dein Problem.

                          Ausgehend von deiner XML könnte es der Inhalt vom modul_header sein.
                          z.B. wo dort Aufgaben, Daten oder Angebot zu finden ist gilt als Interessant.
                          Dies kann in eine sog. Whitelist gesteckt werden.

                          Dafür mal ein kleines Beispiel. Der Gefahr bewußt, dich womöglich auf den falschen Weg zu belassen, bleib ich bei Simple-XML:
                          PHP-Code:
                          $whitList = array('Aufgaben','Daten','Angebot');

                          $xml simplexml_load_file('forum/example1.xml');
                          $nodeListAnlagen $xml->xpath('//anlage');

                          foreach(
                          $nodeListAnlagen as $no => $nodeAnlage) {
                            echo 
                          'Anlage '.$no.':<br>';
                            
                            foreach(
                          $nodeAnlage as $text_modules) {
                              
                          $modul_header trim($text_modules->modul_header);
                              if(
                          in_array($modul_header,$whitList)) {
                                echo 
                          $modul_header' : 'trim($text_modules->modul_text). '<br>';
                              }
                            }

                          Ausgabe:
                          Anlage 0:
                          Aufgaben : Interessant
                          Daten : Interessant
                          Angebot : Interessant
                          Anlage 1:
                          Aufgaben : Interessant2
                          Daten : Interessant2
                          Angebot : Interessant2

                          LG jspit

                          Kommentar

                          Lädt...
                          X