kostenloser Webspace werbefrei: lima-city


json_decode vs simplexml_load_string

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    zitatbox

    zitatbox hat kostenlosen Webspace.

    Hallo

    Wenn ich die gleichen Daten als XML oder als JSON habe,
    bekomme ich bei Auslesen jeweils unterschiedliche Ergebnisse

    Beispiel-Daten (PHP)
    $daten[0] = '<a href="http://www.google.de" title="Google">Suche bei Google</a>'; 
    $daten[1] = '<a href="http://www.bing.de" title="Bing">Suche bei Bing</a>'; 
    $daten[2] = 'Ein Text ohne Link';


    wenn die Daten als JSON vorliegen und ich Auslese mit json_decode()
    ... Ausgabe mit print_r($json_result)
    stdClass Object
    (
        [a] => Array
            (
                [0] => stdClass Object
                    (
                        [href] => http://www.google.de
                        [title] => Google
                        [content] => Suche bei Google
                    )
    
                [1] => stdClass Object
                    (
                        [href] => http://www.bing.de
                        [title] => Bing
                        [content] => Suche bei Bing
                    )
                [2] => Ein Text ohne Link
    }



    wenn die Daten als XML vorliegen und ich Auslese mit simplexml_load_string()
    ... Ausgabe mit print_r($xml_result)
    SimpleXMLElement Object
    (
        [a] => Array
            (
                [0] => Suche bei Google
                [1] => Suche bei Bing
                [2] => Ein Text ohne Link
            }
    }


    also hier ist mit print_r() die Ausgabe ohne Attribute
    es ist kein Unterschied zu erkennen, ob weitere Attribute vorhanden sind,
    beides ... "Link-Text " und "nur Text" sehen "gleich" aus = nur String

    erst wenn ich Ausgabe direkt für ein [a] Objekt mache
    dann sehe ich die Attribute, aber ohne 'content' wie bei JSON

    print_r($xml_result->a[0])
    SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [href] => http://www.google.de
                [title] => Google
            )
    )


    jetzt habe ich zwar die Attrubute, aber der "Link-Text" aka 'content' fehlt ...


    FRAGE .... wie baue ich das XML Ergebnis um, damit die Werte nicht in [@attributes] sind
    sondern (so wie bei json_decode) direkt als Objekt vorliegen ?
    ... gerne auch inklusive dem "Link-Text" aka 'content' also dem "nicht-Attribut" ...


  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. t**k

    Du darfst diese Werte eben nicht as Attribut übergeben im XML, sondern als Unterpunkt. (<a><href>http://www.google.de</href>[...]</a>)
  4. Autor dieses Themas

    zitatbox

    zitatbox hat kostenlosen Webspace.

    hmm, aber auf die XML Datei habe ich keinen Einfluss, da muss ich nehmen was kommt ...

    ich hab mir jetzt eine Funktion gebastelt
    function attributes_to_object($object) { 
    	$attributes = $object->attributes(); 
    	$new_object = new stdClass;
    	if (!empty($attributes)) { 
    		foreach ($attributes as $attr_key => $attr_val) { 
    			$new_object->$attr_key = (string)$attr_val; 
    		}
    		$new_object->content = (string)$object; 
    	}
    	else { 
    		$new_object = (string)$object; 
    	}
    	return $new_object; 
    }



    Aber dazu muss ich das Element kennen, in dem die Attribute sind, hier
    $xml_result->a

    $test_data = array(); 
    foreach($xml_result->a as $aitem) { 
    $test_data[] = attributes_to_object($aitem); 
    }


    ich bräuchte was, mit dem ich egal für welches Ergebnis aus simplexml
    die Attribute in Standard-Objekte umwandeln kann, am besten rekrusiv, also über alle Ebenen

  5. t**k

    Kannst du nicht einfach die JSON Datei nehmen? Ich glaube das wäre einfacher, als da was zu schreiben, was das Erfüllt, was du möchtest...
  6. Autor dieses Themas

    zitatbox

    zitatbox hat kostenlosen Webspace.

    das wäre schön,
    aber ich habe verschiedene Datenquellen die mal XML sind und mal JSON
    und die Ergebnisse will ich gerne einheitlich haben.

    habs ja schon fast, komme immerhin auch an die Attribute aus SimpleXML-Objekt dran,
    aber eben nur für "bekannte" Elemente, jetzt fehlt mir noch ein rekrusiver Durchlauf
    um für alle Elemente und deren "Children" eventuelle Attribute direkt als Objekt zu bekommen,
    also über alle Ebenen, denn manche Daten sind auch derb verschactelt,
    das oben ist nur ein einfaches Beispiel

    also ich brauche wohl eine Funktion mit Rekursion
    irgendwie mit
    if($xml_result->hasChildren()) { ... }
    aber ich bekommst nicht hin

    (oder gibts ne besseere Lösung als Rekursion um alle Ebenen durch zu gehen ?)

  7. t**k

    Also wenn der Code schonmal macht, was er soll, solltest du versuchen mit der weiter zu arbeiten. Also ich meine damit, dass du der Funktion das gesamte Objekt übergibst und die den Rest macht.

    function attributes_to_object($object) {
        $attributes = $object->attributes();
        $new_object = new stdClass;
        if (!empty($attributes)) {
            foreach ($attributes as $attr_key => $attr_val) {
                $new_object->$attr_key = (string)$attr_val;
            }
            $new_object->content = (string)$object;
        }
        else {
            $new_object = (string)$object;
        }
    
        if(/* Prüfung: Objekt hat noch Kindelemente */) {
            foreach($object as $str_key => $obj_value) {
                $object->$str_key = attributes_to_object($obj_value);
            }
        } else {
            return $new_object;
        }
    }

    So ungefähr würde ich das rekursiv gestalten. Das hinzugefügte ist aber nicht getestet und auch nicht ganz vollständig. Wenn es nicht klappen sollte und die Hilfe brauchst, wären Beispieldaten ganz nett.
    (Ich bin mal davon ausgegangen, dass die Funktion das macht, was sie soll.)
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!