json_decode vs simplexml_load_string
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
attribut
ausgabe
auslese
code
datei
datum
durchlauf
element
ergebnis
funktion
http
machen
nehmen
objekt
standard
string
suche
text
vorliegen
-
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" ...
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Du darfst diese Werte eben nicht as Attribut übergeben im XML, sondern als Unterpunkt. (<a><href>http://www.google.de</href>[...]</a>)
-
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
-
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...
-
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
aber ich bekommst nicht hinif($xml_result->hasChildren()) { ... }
(oder gibts ne besseere Lösung als Rekursion um alle Ebenen durch zu gehen ?)
-
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.) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage