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

  • brimborium
    hat ein Thema erstellt XML mit mehreren gleichen Feldnamen gezielt auslesen.

    XML mit mehreren gleichen Feldnamen gezielt auslesen

    Hallo, ich muss ein XML auslesen welches doppelte Feldnamen enthält:

    Code:
    <?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>

    Mich interessiert der Inhalt der Felder, die ich mit "Interessant" markiert habe.

    Wie komme ich da dran?

    Versucht habe ich schon:
    Code:
    foreach ($anlage->text_modules->modul_text as $inhalt) {
    			echo $inhalt;
    }
    Oder $anlage->text_modules->modul_text[1]

    Ich komm bisher nicht drauf.

  • jspit
    antwortet
    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

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    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

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    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.

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    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.

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    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.

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    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.

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    Um was gehts denn genau ? ( Was ist dein primäres Ziel ? )

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    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

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    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 )

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    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

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    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

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    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
    );

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    Eigentlich sollte in dem Fall von mir folgendes kommen:
    Interessant
    Interessant2

    Und es klappt nicht, da gar nichts ausgegeben wird und auch keine Fehlermeldung auftritt.

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Ich brauchs für mehrere Daten
    Ich meinte genau, was muss dabei rauskommen, welche Felder bzw. was fehlt noch konkret zB in Bezug auf meinen Schnipsel ... Hast ein Beispiel?

    Klappt auch nicht :/
    Ja und das bedeutet was genau?

    Bitte etwas konkreter werden....

    Einen Kommentar schreiben:

Lädt...
X