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
    antwortet
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <source>
        <anlagen>
            <anlage>
                <text_modules>
                    <modul_header>
                        Werbung
                    </modul_header>
                    <modul_text>
                        <![CDATA[Uninteressant]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Aufgaben
                    </modul_header>
                    <modul_text>
                        <![CDATA[Interessant]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Daten
                    </modul_header>
                    <modul_text>
                        <![CDATA[Interessant]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Angebot
                    </modul_header>
                    <modul_text>
                        <![CDATA[Interessant]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Bewertung
                    </modul_header>
                    <modul_text>
                        <![CDATA[Unteressant]]>
                    </modul_text>
                </text_modules>
            </anlage>
            <anlage>
                <text_modules>
                    <modul_header>
                        Werbung
                    </modul_header>
                    <modul_text>
                        <![CDATA[Uninteressant2]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Aufgaben
                    </modul_header>
                    <modul_text>
                        <![CDATA[Interessant2]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Daten
                    </modul_header>
                    <modul_text>
                        <![CDATA[Interessant2]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Angebot
                    </modul_header>
                    <modul_text>
                        <![CDATA[Interessant2]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Bewertung
                    </modul_header>
                    <modul_text>
                        <![CDATA[Unteressant2]]>
                    </modul_text>
                </text_modules>
            </anlage>
    	</anlagen>
    </source>
    Ich brauchs für mehrere Daten. Und hatte es so versucht:

    Code:
    foreach ($file->anlagen as $anlage) {
    	foreach ($anlage->text_modules as $inhalt) {
    		$inhalt_array[]=$inhalt->modul_text;
    	}
    	echo $inhalt_array[1];
    	echo "<br>";
    }
    Klappt auch nicht :/

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Dann mach doch nicht so

    Welche Infos benötigst du? Ausgehend von dem XML-String in #10 (mit CDATA):

    PHP-Code:
    // ... siehe #10

    foreach ($xml->anlagen->anlage->text_modules as $inhalt) {
        echo 
    $inhalt->modul_header.": ".$inhalt->modul_text."<br>";
    }

    /*
     Werbung: Uninteressant 
     Aufgaben: Interessant 
     Daten: Interessant 
     Angebot: Interessant 
     Bewertung: Unteressant 
    */ 

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    Ich verstehe mein Problem ja leider auch nicht

    Jedenfalls ist es so, dass wenn ich
    Code:
    foreach ($anlage->text_modules as $inhalt) {
    echo $inhalt->modul_text;
    }
    mache ich keine Inhalte bekomme. Wenn ich aber das CDATA aus einem Feld entferne, wird mir dieses dann ausgegeben.

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Versteh dein Problem nicht.. das CDATA ändert nichts an meinem Post oben.. Meines Wissens "defineirt" das CDATA "nur" das es sich tatsälich um Inhalts-Daten und kein Element ("Tags") handelt... Auch wenn ich mich da nicht so gut auskenne - habs von hier: http://www.w3.org/TR/REC-xml/#sec-cdata-sect

    Schau - Test:

    PHP-Code:
    <?php
    error_reporting
    (-1);

    $str '<?xml version="1.0" encoding="utf-8"?>
    <source>
        <anlagen>
            <anlage>
                <text_modules>
                    <modul_header>
                        Werbung
                    </modul_header>
                    <modul_text>
                        <![CDATA[Uninteressant]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Aufgaben
                    </modul_header>
                    <modul_text>
                        <![CDATA[Interessant]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Daten
                    </modul_header>
                    <modul_text>
                        <![CDATA[Interessant]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Angebot
                    </modul_header>
                    <modul_text>
                        <![CDATA[Interessant]]>
                    </modul_text>
                </text_modules>
                <text_modules>
                    <modul_header>
                        Bewertung
                    </modul_header>
                    <modul_text>
                        <![CDATA[Unteressant]]>
                    </modul_text>
                </text_modules>
            </anlage>
        </anlagen>
    </source>'
    ;
        
    $xml simplexml_load_string($str);

    foreach (
    $xml->anlagen->anlage->text_modules as $inhalt) {
        echo 
    $inhalt->modul_text."<br>";
    }
    gibt nach wie vor:

    PHP-Code:
    /*
      Uninteressant 
      Interessant 
      Interessant 
      Interessant 
      Unteressant 
    */ 
    LG

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    Zitat von hausl Beitrag anzeigen
    1. umrahmt?
    Das Verstehe ich unter umrahmt:
    <![CDATA[Interessant]]>

    Zitat von hausl Beitrag anzeigen
    2. von CDATA ist oben nichts zu sehen.]]>
    Konnte den eigentlichen Inhalt der xml hier nicht posten. Darum hatte ich nur das wichtigste kopiert.

    Bei mir funktioniert ja folgendes:
    Code:
    	foreach ($anlagen as $datum_sort) {
    		foreach ($datum_sort as $anlage) {
    			foreach ($anlage->text_modules as $inhalt) {
    				$inhalt_array[]=$inhalt->modul_text;
    			}
    			echo $inhalt_array[1];
    		}
    	}
    Mir wird das zweite Feld damit ausgegeben, oder welches Feld auch immer ich wähle. Allerdings bleibt dieser Wert für jede weitere Anlage gleich. Diese haben aber unterschiedlichen Inhalt. Woran könnte das liegen? Bringt mich echt um meinen Schlaf. Hoffentlich nicht auch deinen

    Einen Kommentar schreiben:


  • hausl
    antwortet
    1. umrahmt?
    2. von CDATA ist oben nichts zu sehen.

    Ansonsten:

    PHP-Code:
    <?php
    error_reporting
    (-1);
    $str =
    '<?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 simplexml_load_string($str);
    foreach (
    $xml->anlagen->anlage->text_modules as $inhalt) {
        echo 
    $inhalt->modul_text."<br>";
    }

    /* 
      Uninteressant 
      Interessant 
      Interessant 
      Interessant 
      Unteressant 
    */

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    Ja, da hatte ich beim hierher kopieren einen Fehler gemacht, sorry.

    Ich glaube ich habe den Übeltäter. Im XML sind die Felder mit
    <![CDATA[]]> umrahmt. Kann man das irgendwie ignorieren?

    Einen Kommentar schreiben:


  • hausl
    antwortet
    error_reporting mal aufgedreht? dein XML ist nicht wellformed..

    Code:
    ...
    <anlagen>
    <source>
    eher

    Code:
    </anlagen>
    </source>
    ??

    Wenn ich das zum Test mal korr, dann kommt bei print_r() das raus:

    Code:
    SimpleXMLElement Object
    (
        [anlagen] => SimpleXMLElement Object
            (
                [anlage] => SimpleXMLElement Object
                    (
                        [text_modules] => Array
                            (
                                [0] => SimpleXMLElement Object
                                    (
                                        [modul_header] => 
    					Werbung
    				
                                        [modul_text] => 
    					Uninteressant
    				
                                    )
    
                                [1] => SimpleXMLElement Object
                                    (
                                        [modul_header] => 
    					Aufgaben
    				
                                        [modul_text] => 
    					Interessant
    				
                                    )
    
                                [2] => SimpleXMLElement Object
                                    (
                                        [modul_header] => 
    					Daten
    				
                                        [modul_text] => 
    					Interessant
    				
                                    )
    
                                [3] => SimpleXMLElement Object
                                    (
                                        [modul_header] => 
    					Angebot
    				
                                        [modul_text] => 
    					Interessant
    				
                                    )
    
                                [4] => SimpleXMLElement Object
                                    (
                                        [modul_header] => 
    					Bewertung
    				
                                        [modul_text] => 
    					Unteressant
    				
                                    )
    
                            )
    
                    )
    
            )
    
    )

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    Hm, wenn ich ein vardump von $anlage->text_modules mache, bekomme ich

    Code:
    object(SimpleXMLElement)#2400 (2) {
      ["modul_header"]=>
      object(SimpleXMLElement)#2440 (0) {
      }
      ["modul_text"]=>
      object(SimpleXMLElement)#2441 (0) {
      }
    }
    Wieso ist das leer?

    Und warum kann ich kein
    Code:
    echo $anlage->text_modules->modul_text;
    machen. Aber ein:
    Code:
    $test=$anlage->text_modules->modul_text;
    echo $test;
    Damit funktioniert es jetzt so:
    Code:
    foreach ($anlage->text_modules as $inhalt) {
    $array[]=$inhalt->modul_text;
    }
    echo $array[2];

    Einen Kommentar schreiben:


  • brimborium
    antwortet
    Zitat von inkamina Beitrag anzeigen
    foreach ($anlage->text_modules as $inhalt) {
    echo $inhalt->modul_text;
    }
    Liefert leider keine Werte, obwohls gut aussieht. Hmm. Wenn ich

    Code:
    $anlage->text_modules->modul_text
    mache, bekomme ich den Inhalt des ersten Feldes.

    xslt, habe ich spontan nicht geblickt. Muss ich mir noch anschauen.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    kannste ja auch locker mit xslt machen:
    http://www.php.de/php-einsteiger/109...e-via-php.html

    Einen Kommentar schreiben:


  • inkamina
    antwortet
    foreach ($anlage->text_modules as $inhalt) {
    echo $inhalt->modul_text;
    }

    Einen Kommentar schreiben:

Lädt...
X