Schlüssel und Werte werden vertauscht - Sie können dies array_flip()vor dem array_walk beheben. array_walk_recursiveerfordert PHP 5. Sie könnten array_walkstattdessen verwenden, aber Sie werden dann nicht 'stack' => 'overflow'in die XML bekommen.
Dies funktioniert nicht, wenn $ test_array 'more_another_array' wie 'another_array' hat, da der Schlüssel 'another_array' nicht konvertiert wird. Daher haben Sie mehrere '<Überlauf> Stapel </ Überlauf>'.
Understack
11
Das array_flipfunktioniert nicht, da es keine Arrays umdrehen kann (wie das another_arrayInnere des Haupt-Arrays).
Lode
14
Wo ist das XML-Element "another_array"? Alles ist abgeflacht :(
FMaz008
2
Hat super funktioniert, als ich array_flip vor array_walk_recursive hinzugefügt habe. Vielen Dank.
Mike Purcell
12
Downvoting, weil array_flipnur funktioniert, wenn das Array keine identischen Werte enthält.
Martijn
385
Hier ist PHP 5.2 Code, der Arrays beliebiger Tiefe in XML-Dokumente konvertiert:
Dies, IMO, ist eine viel bessere Lösung als die akzeptierte Antwort. Dies hat jedoch die Einschränkung, dass bei numerisch verschlüsselten Arrays fehlerhaftes XML generiert wird. <0> <1> <2> sind keine gültigen Knotennamen.
KOGI
2
Wenn Ihr Array mit numerischen Schlüsseln jedoch nur ein anderes Array enthält, das nicht mit numerischen Schlüsseln versehen ist, wird dies nicht der Fall sein.
Bryan Petty
15
@ KOGI Ich habe Hanmant Antwort geändert. Jetzt unterstützt es mehrstufige Arrays. pastebin.com/pYuXQWee
Mifas
1
In diesem Beispiel werden Sonderzeichen in Elementtextdaten mithilfe von htmlspecialchars explizit umgangen, aber SimpleXMLElement :: addChild übersetzt XML-Sonderzeichen automatisch in ihre Zeichenentitäten, sodass htmlspecialchars weggelassen werden können. Interessanterweise scheint dies nicht zu doppelt entkommenen Daten zu führen.
mbaynton
3
@Alex, Ihre Bearbeitung Nr. 5 lässt das Beispiel fehlschlagen. Vor jedem <student> -Datensatz wird <item $ x> eingefügt, sodass die XML-Ausgabe nicht den vom Autor beabsichtigten entspricht. Geben Sie möglicherweise ein Beispiel für das Problem, das Sie beheben möchten, und wir können für beide Fälle eine andere Lösung finden. Es dauerte eine Weile, bis mir klar wurde, dass der Code des Autors geändert wurde.
Nicholas Blasgen
124
Die hier bereitgestellten Antworten konvertieren Array nur mit Knoten in XML. Sie können keine Attribute festlegen. Ich habe eine PHP-Funktion geschrieben, mit der Sie ein Array in PHP konvertieren und Attribute für bestimmte Knoten in der XML festlegen können. Der Nachteil hier ist, dass Sie ein Array auf eine bestimmte Weise mit wenigen Konventionen erstellen müssen (nur wenn Sie Attribute verwenden möchten).
Im folgenden Beispiel können Sie Attribute auch in XML festlegen.
Ich habe vermutet, dass niemand darauf reagiert hat. Diese Klasse ist wirklich nützlich, da sie das Gegenteil von dem tut, was simpleXMLElement generiert. So haben Sie die Möglichkeit, SimpleXMLElement in beide Richtungen zu verwenden.
FMaz008
4
Ich würde es als Antwort anstelle von aktuell markieren. Aktuelle Antwort nicht rekursive Arrays
erstellen
2
Schöne Klasse. Ich wechselte die Leitung 128 if(!is_array($arr)) {zu , if(!is_array($arr) && $arr !== '') {so dass es nicht einen neuen Textknoten für leere Strings anhängen und deshalb hält die Kurz leer - Tag - Format , dh 'tag'=>''ist <tag/>statt<tag></tag>
user1433150
Dies ist die bisher beste Antwort. Auch dies hat die korrekte Struktur mehrerer Elemente mit demselben Schlüssel: 1. ist der Knotenname Schlüssel, dann enthält es das Array mit numerischen Schlüsseln. (das Gegenteil der Hanmant-Antwort)
Ich habe alle Antworten gefunden, um zu viel Code zu verwenden. Hier ist eine einfache Möglichkeit, dies zu tun:
function to_xml(SimpleXMLElement $object, array $data){foreach($data as $key => $value){if(is_array($value)){
$new_object = $object->addChild($key);
to_xml($new_object, $value);}else{// if the key is an integer, it needs text with it to actually work.if($key ==(int) $key){
$key ="key_$key";}
$object->addChild($key, $value);}}}
Dann ist es eine einfache Sache, das Array in die Funktion zu senden, die Rekursion verwendet, damit es ein mehrdimensionales Array verarbeitet:
Ich liebe diese Lösung am meisten. Es wäre jedoch schön, einen Test für Zifferntasten hinzuzufügen, wie : if ( is_numeric( $key ) ) $key = "numeric_$key"; .
Ohne
@wout Guter Fang. Hinzugefügt. Ich habe anstelle von is_numeric eine Int-Cast-Prüfung durchgeführt, da is_numeric einige, wenn auch technisch erwartete, Ergebnisse liefern kann, die Sie wirklich abschrecken würden.
Francis Lewis
Ich benutze diese Funktion, habe sie aber $xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><rootTag/>');für eine gültige UTF-8-Codierung geändert .
Daantje
Ich mag diese Lösung auch am liebsten, einfach ist es :-) Eine Bemerkung: Vielleicht möchten Sie sie ändern, $object->addChild($key, $value);um $object->addChild($key, htmlspecialchars($value));zu verhindern, dass sie fehlschlägt, wenn $ value Zeichen wie "&" enthält, die XML-Codierung benötigen.
Dies schlägt fehl, wenn Ihr Array ein inneres Array mit numerischen Indizes enthält. <0> ... </ 0> ist kein gültiges XML.
Adriano Varoli Piazza
@AdrianoVaroliPiazza fügen Sie einfach etwas wie $k = (is_numeric($k)) ? 'item' : $k;inforeach()
AlienWebguy
Wenn einer der Schlüssel im Array "body" heißt, funktioniert er nicht - genauer gesagt, der Schlüssel wird ignoriert und durchlaufen. Ich versuche herauszufinden warum.
Bambax
@Bambax Der einzige Grund, an den ich denken kann, ist, dass das XML zu einem späteren Zeitpunkt als HTML analysiert wird.
Also trotzdem ... Ich habe den Code von onokazu genommen (danke!) Und die Möglichkeit hinzugefügt, wiederholte Tags in XML zu haben. Er unterstützt auch Attribute. Ich hoffe, jemand findet ihn nützlich!
Könnte hilfreich sein, Ihre Änderungen zu kommentieren, um den Code klarer zu machen.
Trotzdem
Dies funktionierte bei mir mit WP All Export. Ich musste den is_numeric Teil leicht ändern: if (is_numeric($k)) { $i = $k + 1; $child = $xml->addChild("_$i"); array_to_xml($v, $child); }
Achiever
4
Ich verwende einige Funktionen, die ich vor einiger Zeit geschrieben habe, um die XML-Datei zu generieren, die von PHP und jQuery usw. hin und her übertragen werden soll. Weder zusätzliche Frameworks verwenden lediglich eine Zeichenfolge, die dann mit SimpleXML (oder einem anderen Framework) verwendet werden kann ) ...
Wenn es für jemanden nützlich ist, benutze es bitte :)
function get_formatted_xml(SimpleXMLElement $xml, $domver =null, $preserveWhitespace =true, $formatOutput =true){// http://stackoverflow.com/questions/1191167/format-output-of-simplexml-asxml// create new wrapper, so we can get formatting options
$dom =newDOMDocument($domver);
$dom->preserveWhiteSpace = $preserveWhitespace;
$dom->formatOutput = $formatOutput;// now import the xml (converted to dom format)/*
$ix = dom_import_simplexml($xml);
$ix = $dom->importNode($ix, true);
$dom->appendChild($ix);
*/
$dom->loadXML($xml->asXML());// printreturn $dom->saveXML();}//-- fn get_formatted_xml
Die meisten der obigen Antworten sind richtig. Ich habe jedoch diese Antwort gefunden, die das Kompatibilitätsproblem array_walk_recursive und auch das Problem der numerischen Schlüssel löst. Es hat auch alle Tests bestanden, die ich gemacht habe:
function arrayToXML(Array $array,SimpleXMLElement&$xml){foreach($array as $key => $value){// None arrayif(!is_array($value)){(is_numeric($key))? $xml->addChild("item$key", $value): $xml->addChild($key, $value);continue;}// Array
$xmlChild =(is_numeric($key))? $xml->addChild("item$key"): $xml->addChild($key);
arrayToXML($value, $xmlChild);}}
Ich habe auch eine Testklasse hinzugefügt, die Sie vielleicht nützlich finden:
classArrayToXmlTestextendsPHPUnit_Framework_TestCase{publicfunction setUp(){}publicfunction tearDown(){}publicfunction testFuncExists(){
$this->assertTrue(function_exists('arrayToXML'));}publicfunction testFuncReturnsXml(){
$array = array('name'=>'ardi','last_name'=>'eshghi','age'=>31,'tel'=>'0785323435');
$xmlEl =newSimpleXMLElement('<root/>');
arrayToXml($array, $xmlEl);
$this->assertTrue($xmlEl instanceOf SimpleXMLElement);}publicfunction testAssocArrayToXml(){
$array = array('name'=>'ardi','last_name'=>'eshghi','age'=>31,'tel'=>'0785323435');
$expectedXmlEl =newSimpleXMLElement('<root/>');
$expectedXmlEl->addChild('name', $array['name']);
$expectedXmlEl->addChild('last_name', $array['last_name']);
$expectedXmlEl->addChild('age', $array['age']);
$expectedXmlEl->addChild('tel', $array['tel']);
$actualXmlEl =newSimpleXMLElement('<root/>');
arrayToXml($array, $actualXmlEl);
$this->assertEquals($expectedXmlEl->asXML(), $actualXmlEl->asXML());}publicfunction testNoneAssocArrayToXml(){
$array = array('ardi','eshghi',31,'0785323435');// Expected xml value
$expectedXmlEl =newSimpleXMLElement('<root/>');foreach($array as $key => $value)
$expectedXmlEl->addChild("item$key", $value);// What the function produces
$actualXmlEl =newSimpleXMLElement('<root/>');
arrayToXml($array, $actualXmlEl);
$this->assertEquals($expectedXmlEl->asXML(), $actualXmlEl->asXML());}publicfunction testNestedMixArrayToXml(){
$testArray = array("goal","nice","funny"=> array('name'=>'ardi','tel'=>'07415517499',"vary","fields"=> array('small','email'=>'[email protected]'),'good old days'),"notes"=>"come on lads lets enjoy this","cast"=> array('Tom Cruise','Thomas Muller'=> array('age'=>24)));// Expected xml value
$expectedXmlEl =newSimpleXMLElement('<root/>');
$expectedXmlEl->addChild('item0', $testArray[0]);
$expectedXmlEl->addChild('item1', $testArray[1]);
$childEl = $expectedXmlEl->addChild('funny');
$childEl->addChild("name", $testArray['funny']['name']);
$childEl->addChild("tel", $testArray['funny']['tel']);
$childEl->addChild("item0","vary");
$childChildEl = $childEl->addChild("fields");
$childChildEl->addChild('item0','small');
$childChildEl->addChild('email', $testArray['funny']['fields']['email']);
$childEl->addChild("item1",'good old days');
$expectedXmlEl->addChild('notes', $testArray['notes']);
$childEl2 = $expectedXmlEl->addChild('cast');
$childEl2->addChild('item0','Tom Cruise');
$childChildEl2 = $childEl2->addChild('Thomas Muller');
$childChildEl2->addChild('age', $testArray['cast']['Thomas Muller']['age']);// What the function produces
$actualXmlEl =newSimpleXMLElement('<root/>');
arrayToXml($testArray, $actualXmlEl);
$this->assertEquals($expectedXmlEl->asXML(), $actualXmlEl->asXML());}}
Dies hat einen unerwarteten Effekt beim Erstellen von XML im RPC-Stil mit Methoden wie methodCall, methodName, Skalaren und Vektoren usw. Es konvertiert ein Array nicht wirklich in XML im einfachen Sinne.
Volomike
3
Wenn das Array assoziativ und korrekt verschlüsselt ist, ist es wahrscheinlich einfacher, es zuerst in XML umzuwandeln. Etwas wie:
Verwenden Sie dann für jeden Teil Ihres Arrays etwas Ähnliches wie meine Texterstellungsschleife und verwenden Sie stattdessen die Simplexml-Funktionen "addChild" für jeden Knoten des Arrays.
Ich werde das später ausprobieren und diesen Beitrag mit beiden Versionen aktualisieren.
Das Bit, in dem ich "<array> </ array>" erwähnte, machte mir klar, dass die String-Version etwas Ähnliches benötigt. Grundsätzlich muss das Array einen Knoten ganz außen haben. Lassen Sie mich über die ganze Sache schlafen, ich werde etwas haben, das diesen anfänglichen Fehler sofort auffängt.
Anthony
2
Nur eine Bearbeitung einer Funktion oben, wenn eine Taste numerisch ist, fügen Sie ein Präfix "key_" hinzu.
// initializing or creating array
$student_info = array(your array data);// creating object of SimpleXMLElement
$xml_student_info =newSimpleXMLElement("<?xml version=\"1.0\"?><student_info></student_info>");// function call to convert array to xml
array_to_xml($student,$xml_student_info);//saving generated xml file
$xml_student_info->asXML('file path and name');function array_to_xml($student_info,&$xml_student_info){foreach($student_info as $key => $value){if(is_array($value)){if(!is_numeric($key)){
$subnode = $xml_student_info->addChild("$key");
array_to_xml($value, $subnode);}else{
$subnode = $xml_student_info->addChild("key_$key");
array_to_xml($value, $subnode);}}else{if(!is_numeric($key)){
$xml_student_info->addChild("$key","$value");}else{
$xml_student_info->addChild("key_$key","$value");}}}}
Sie können die folgende Funktion in Ihrem Code direkt verwenden:
function artoxml($arr, $i=1,$flag=false){
$sp ="";for($j=0;$j<=$i;$j++){
$sp.=" ";}foreach($arr as $key=>$val){
echo "$sp<".$key.">";if($i==1) echo "\n";if(is_array($val)){if(!$flag){echo"\n";}
artoxml($val,$i+5);
echo "$sp</".$key.">\n";}else{
echo "$val"."</".$key.">\n";}}}
Rufen Sie die Funktion mit dem ersten Argument als Array auf, und das zweite Argument muss 1 sein. Dies wird für eine perfekte Einrückung erhöht, und das dritte muss wahr sein.
Wenn die zu konvertierende Array-Variable beispielsweise $ array1 ist, sollte die aufrufende Funktion beim Aufrufen mit einem <pre>Tag gekapselt werden .
artoxml ($ array1,1, true);
Bitte sehen Sie sich die Seitenquelle nach dem Ausführen der Datei an, da die Symbole <und> auf einer HTML-Seite nicht angezeigt werden.
Sie können xmlrpc_encode verwenden, um eine XML aus einem Array zu erstellen, wenn eine ausführliche XML kein Problem darstellt.
www.php.net/xmlrpc_encode
Seien Sie vorsichtig, die erstellte XML unterscheidet sich, wenn Sie assoziative und / oder numerische Schlüssel verwenden
<?php
// /params/param/value/struct/member// there is a tag "member" for each element// "member" contains a tag "name". its value is the associative key
$xml1 = xmlrpc_encode(array('a'=>'b','c'=>'d'));
$simplexml1 = simplexml_load_string($xml1);
print_r($xml1);
print_r($simplexml1);// /params/param/value/array/data// there is a tag "data" for each element// "data" doesn't contain the tag "name"
$xml2 = xmlrpc_encode(array('a','b'));
$simplexml2 = simplexml_load_string($xml2);
print_r($xml2);
print_r($simplexml2);?>
Diese Funktion wird nicht unterstützt und ist in meinen Builds von PHP 5.2.16 oder PHP 5.3.5 nicht enthalten. (gibt "PHP Fatal error: Aufruf der undefinierten Funktion xmlrpc_encode ()" zurück)
Danorton
Sie müssen die folgende Zeile in php.ini auskommentieren: extension = php_xmlrpc.dll
w35l3y
@ w35l3y Ich habe meine INI überprüft. Es enthält nicht einmal diese Erweiterung und ich verwende Version 5.3.6.
Meine Antwort, die Antworten anderer zusammenzuschustern. Dies sollte das Versagen korrigieren, numerische Tasten zu kompensieren:
function array_to_xml($array, $root, $element){
$xml =newSimpleXMLElement("<{$root}/>");foreach($array as $value){
$elem = $xml->addChild($element);
xml_recurse_child($elem, $value);}return $xml;}function xml_recurse_child(&$node, $child){foreach($child as $key=>$value){if(is_array($value)){foreach($value as $k => $v){if(is_numeric($k)){
xml_recurse_child($node, array($key => $v));}else{
$subnode = $node->addChild($key);
xml_recurse_child($subnode, $value);}}}else{
$node->addChild($key, $value);}}}
Die array_to_xml()Funktion setzt voraus, dass das Array zuerst aus Zifferntasten besteht. Wenn Ihr Array ein Anfangselement hätte, würden Sie die Anweisungen foreach()und $elemaus der array_to_xml()Funktion löschen und $xmlstattdessen einfach übergeben .
Ich hätte die am zweithäufigsten gewählte Antwort kommentiert, da sie die Struktur nicht beibehält und schlechte XML generiert, wenn es numerisch indizierte innere Arrays gibt.
Darauf aufbauend habe ich meine eigene Version entwickelt, da ich unabhängig von der Datenstruktur einen einfachen Konverter zwischen json und xml benötigte. Meine Version behält die numerischen Schlüsselinformationen und die Struktur des ursprünglichen Arrays bei. Es erstellt Elemente für die numerisch indizierten Werte, indem Werte in wertbenannte Elemente mit einem Schlüsselattribut eingeschlossen werden, das einen numerischen Schlüssel enthält.
Antworten:
eine kurze:
führt zu
Schlüssel und Werte werden vertauscht - Sie können dies
array_flip()
vor dem array_walk beheben.array_walk_recursive
erfordert PHP 5. Sie könntenarray_walk
stattdessen verwenden, aber Sie werden dann nicht'stack' => 'overflow'
in die XML bekommen.quelle
array_flip
funktioniert nicht, da es keine Arrays umdrehen kann (wie dasanother_array
Innere des Haupt-Arrays).array_flip
nur funktioniert, wenn das Array keine identischen Werte enthält.Hier ist PHP 5.2 Code, der Arrays beliebiger Tiefe in XML-Dokumente konvertiert:
generiertes XML wäre wie folgt:
PHP-Snippet
Dokumentation zur
SimpleXMLElement::asXML
Verwendung in diesem Snippetquelle
Die hier bereitgestellten Antworten konvertieren Array nur mit Knoten in XML. Sie können keine Attribute festlegen. Ich habe eine PHP-Funktion geschrieben, mit der Sie ein Array in PHP konvertieren und Attribute für bestimmte Knoten in der XML festlegen können. Der Nachteil hier ist, dass Sie ein Array auf eine bestimmte Weise mit wenigen Konventionen erstellen müssen (nur wenn Sie Attribute verwenden möchten).
Im folgenden Beispiel können Sie Attribute auch in XML festlegen.
Die Quelle finden Sie hier: https://github.com/digitickets/lalit/blob/master/src/Array2XML.php
quelle
if(!is_array($arr)) {
zu ,if(!is_array($arr) && $arr !== '') {
so dass es nicht einen neuen Textknoten für leere Strings anhängen und deshalb hält die Kurz leer - Tag - Format , dh'tag'=>''
ist<tag/>
statt<tag></tag>
Ich habe alle Antworten gefunden, um zu viel Code zu verwenden. Hier ist eine einfache Möglichkeit, dies zu tun:
Dann ist es eine einfache Sache, das Array in die Funktion zu senden, die Rekursion verwendet, damit es ein mehrdimensionales Array verarbeitet:
Jetzt enthält $ xml ein schönes XML-Objekt, das auf Ihrem Array basiert und genau so ist, wie Sie es geschrieben haben.
quelle
if ( is_numeric( $key ) ) $key = "numeric_$key";
.$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><rootTag/>');
für eine gültige UTF-8-Codierung geändert .$object->addChild($key, $value);
um$object->addChild($key, htmlspecialchars($value));
zu verhindern, dass sie fehlschlägt, wenn $ value Zeichen wie "&" enthält, die XML-Codierung benötigen.quelle
$k = (is_numeric($k)) ? 'item' : $k;
inforeach()
Ab PHP 5.4
quelle
Eine weitere Verbesserung:
Verwendungszweck:
quelle
Hier ist mein Eintrag, einfach und sauber ..
quelle
Also trotzdem ... Ich habe den Code von onokazu genommen (danke!) Und die Möglichkeit hinzugefügt, wiederholte Tags in XML zu haben. Er unterstützt auch Attribute. Ich hoffe, jemand findet ihn nützlich!
quelle
if (is_numeric($k)) { $i = $k + 1; $child = $xml->addChild("_$i"); array_to_xml($v, $child); }
Ich verwende einige Funktionen, die ich vor einiger Zeit geschrieben habe, um die XML-Datei zu generieren, die von PHP und jQuery usw. hin und her übertragen werden soll. Weder zusätzliche Frameworks verwenden lediglich eine Zeichenfolge, die dann mit SimpleXML (oder einem anderen Framework) verwendet werden kann ) ...
Wenn es für jemanden nützlich ist, benutze es bitte :)
Grüße an alle :)
quelle
Ich wollte einen Code, der alle Elemente in einem Array als Attribute und alle Arrays als Unterelemente behandelt.
Also für so etwas
Ich würde so etwas bekommen
Um dies zu erreichen, ist der Code unten, aber seien Sie sehr vorsichtig, er ist rekursiv und kann tatsächlich einen Stapelüberlauf verursachen :)
Möglicherweise möchten Sie die Länge des Arrays überprüfen, damit ein Element im Datenteil und nicht als Attribut festgelegt wird.
quelle
Basierend auf allem anderen hier werden numerische Indizes + Attribute über das Präfix mit behandelt
@
und können XML in vorhandene Knoten einfügen:Code
Verwendung
Ergebnis
Bonus: XML formatieren
quelle
Hier ist eine Funktion, die den Trick für mich getan hat:
Nennen Sie es einfach mit so etwas wie
quelle
Sie können den XMLParser verwenden , an dem ich gearbeitet habe.
Würde ergeben zu:
quelle
Ich fand diese Lösung ähnlich wie das ursprüngliche Problem
quelle
Die meisten der obigen Antworten sind richtig. Ich habe jedoch diese Antwort gefunden, die das Kompatibilitätsproblem array_walk_recursive und auch das Problem der numerischen Schlüssel löst. Es hat auch alle Tests bestanden, die ich gemacht habe:
Ich habe auch eine Testklasse hinzugefügt, die Sie vielleicht nützlich finden:
quelle
andere Lösung:
quelle
Wenn das Array assoziativ und korrekt verschlüsselt ist, ist es wahrscheinlich einfacher, es zuerst in XML umzuwandeln. Etwas wie:
Der andere Weg wäre, zuerst Ihre grundlegende XML zu erstellen, wie z
Verwenden Sie dann für jeden Teil Ihres Arrays etwas Ähnliches wie meine Texterstellungsschleife und verwenden Sie stattdessen die Simplexml-Funktionen "addChild" für jeden Knoten des Arrays.
Ich werde das später ausprobieren und diesen Beitrag mit beiden Versionen aktualisieren.
quelle
Nur eine Bearbeitung einer Funktion oben, wenn eine Taste numerisch ist, fügen Sie ein Präfix "key_" hinzu.
quelle
Sie können die folgende Funktion in Ihrem Code direkt verwenden:
Rufen Sie die Funktion mit dem ersten Argument als Array auf, und das zweite Argument muss 1 sein. Dies wird für eine perfekte Einrückung erhöht, und das dritte muss wahr sein.
Wenn die zu konvertierende Array-Variable beispielsweise $ array1 ist, sollte die aufrufende Funktion beim Aufrufen mit einem
<pre>
Tag gekapselt werden .Bitte sehen Sie sich die Seitenquelle nach dem Ausführen der Datei an, da die Symbole <und> auf einer HTML-Seite nicht angezeigt werden.
quelle
quelle
Diese Funktion gibt beispielsweise eine Liste von <obj> ... </obj> <obj> ... </ obj> XML-Tags für numerische Indizes zurück.
Eingang:
Ausgabe:
Dies sollte alle gängigen Bedürfnisse befriedigen. Vielleicht können Sie die 3. Zeile ändern in:
oder wenn Sie mit Pluralformen arbeiten, die mit s enden:
quelle
Mit FluidXML können Sie ausgehend von einem PHP-Array ein XML für SimpleXML mit ... nur zwei Codezeilen generieren.
Ein Beispielarray könnte sein
https://github.com/servo-php/fluidxml
quelle
Sie können xmlrpc_encode verwenden, um eine XML aus einem Array zu erstellen, wenn eine ausführliche XML kein Problem darstellt. www.php.net/xmlrpc_encode
Seien Sie vorsichtig, die erstellte XML unterscheidet sich, wenn Sie assoziative und / oder numerische Schlüssel verwenden
quelle
quelle
Meine Antwort, die Antworten anderer zusammenzuschustern. Dies sollte das Versagen korrigieren, numerische Tasten zu kompensieren:
Die
array_to_xml()
Funktion setzt voraus, dass das Array zuerst aus Zifferntasten besteht. Wenn Ihr Array ein Anfangselement hätte, würden Sie die Anweisungenforeach()
und$elem
aus derarray_to_xml()
Funktion löschen und$xml
stattdessen einfach übergeben .quelle
Ich hätte die am zweithäufigsten gewählte Antwort kommentiert, da sie die Struktur nicht beibehält und schlechte XML generiert, wenn es numerisch indizierte innere Arrays gibt.
Darauf aufbauend habe ich meine eigene Version entwickelt, da ich unabhängig von der Datenstruktur einen einfachen Konverter zwischen json und xml benötigte. Meine Version behält die numerischen Schlüsselinformationen und die Struktur des ursprünglichen Arrays bei. Es erstellt Elemente für die numerisch indizierten Werte, indem Werte in wertbenannte Elemente mit einem Schlüsselattribut eingeschlossen werden, das einen numerischen Schlüssel enthält.
Beispielsweise
array('test' => array(0 => 'some value', 1 => 'other'))
konvertiert zu
<test><value key="0">some value</value><value key="1">other</value></test>
Meine Version von array_to_xml -function (hoffe es hilft jemandem :)
quelle
Die gesamte XML-Struktur ist in $ data Array definiert:
quelle
Wenn Sie in Magento arbeiten und diese Art von assoziativem Array haben
Dann ist es am besten, das assoziative Array in das XML-Format zu konvertieren. Verwenden Sie diesen Code in der Controller-Datei.
Ich hoffe es hilft allen.
quelle
quelle