Wenn Sie var_dump verwenden, wird die XML-Struktur als Schlüssel im Objekt angezeigt.
Magus
3
Ich habe einige [CDATA[TEXT]]in einigen Elementen und sie analysieren nicht damit. Es analysiert es als SimpleXMLElement Object. Irgendeine Problemumgehung dafür?
In CDATA-Abschnitten können Probleme auftreten (Rückgabe immer null). Versuchen Sie als Lösung $ xml = simplexml_load_string ($ xmlstring, null, LIBXML_NOCDATA); $ json = json_encode ($ xml); $ array = json_decode ($ json, TRUE); (siehe stackoverflow.com/a/2970701/413531 ) // Verdammt ... gibt es eine Möglichkeit, neue Zeilen in einen Kommentar einzufügen ?
Hirnhamster
4
Wir machen genau das Gleiche, aber mit simplexml_load_file und es funktioniert gut. Danke
Thermech
2
Wofür ist der zweite Parameter (TRUE)?
Mansour Fahad
3
@MansourFahad In json_decode können Sie den optionalen zweiten Parameter als TRUE(normalerweise standardmäßig FALSE) verwenden, um die JSON-Eingabe in ein assoziatives Array zu konvertieren.
Jake Bathman
16
@ Ismael Miguel zu viel Code? Nur weil Sie alle diese Funktionen in eine Zeile setzen, bedeutet dies nicht, dass Sie weniger Code verwenden. Es mag kompakter aussehen, geht jedoch zu Lasten der Lesbarkeit.
Jage
43
Konvertieren einer XML-Zeichenfolge ( $buffer) in ein vereinfachtes Array, bei dem Attribute ignoriert und untergeordnete Elemente mit denselben Namen gruppiert werden:
Wenn Sie die Attribute auch haben möchten, sind sie über die JSON-Codierung / -Decodierung von SimpleXMLElement verfügbar. Dies ist oft die einfachste und schnellste Lösung:
In PHP 7 musste ich folgendes hinzufügen: && (is_countable($node) && 1 === count($node) ? $node = array($node) : 1)Allerdings habe ich in der nächsten Zeile einen Fehler bekommen : [] operator not supported for strings.
andreshg112
@ andreshg112: Ich bin nicht in der Lage (funktioniert stabil PHP 5.3.0 - 7.4.0) zu reproduzieren, hat sich das Verhalten seit Jahren nicht geändert hat , vergleichen Sie gegen Hunderte von verschiedenen PHP - Versionen: 3v4l.org/l4nQN
hakre
Vielleicht liegt es an meiner KML-Datei (es ist eine XML). Ich kann es nicht teilen. Ich habe es bereits importiert, musste es aber anders machen.
andreshg112
Wahrscheinlich sind Sie besorgt über XML-Namespaces. Das Beispiel ist nur für die Teile ohne Namespace (oder der Standard, ich mische dies manchmal).
Wenn Sie in Array umwandeln, brauchen Sie json_encodeund nicht json_decode.
Ismael Miguel
11
@Ismael theoretisch sollte das Casting in ein Array ausreichen. In der Praxis müssen wir auch alle Blattknoten werfen, die auch Objekte sind. Eine naive Besetzung hinterlässt die Blätter als SimpleXML-Objekte. json_encode wirft rekursiv und spart so viel Beinarbeit.
Peter Mellett
2
Wenn Ihre $arrayVariable keine Textwerte enthält, liegt dies möglicherweise an CDATA. Laden Sie Ihr XML mit : new SimpleXMLElement($xml, LIBXML_NOCDATA).
Jonathan Petitcolas
1
ps. $ xml = str_replace (Array ('<! [CDATA [', ']]>'), '', $ xml);
user956584
1
So funktioniert das nicht. Dieser Code würde nicht einmal ein einfaches XML wie dieses konvertieren <?xml version="1.0" encoding="UTF-8"?><note a="b"><body c="d">Hello!</body></note>. Führen Sie den Code aus und Sie werden sehen, dass das Attribut <body>c verloren geht! Überprüfen Sie bitte den vollständigen Code hier , wenn Sie nicht schlecht wollen überrascht github.com/gaarf/XML-string-to-PHP-array/blob/master/... oder siehe meine Antwort unten stackoverflow.com/a/30234924/828366
Manchmal frage ich mich, was der Entwickler, der die PHP-XML-Implementierung erstellt hat, gedacht hat, als xml_parse_into_struct entworfen wurde ...
Anibal Sanchez
7
Die in den akzeptierten Antwort-Drop-Attributen verwendete Methode, wenn untergeordnete Elemente nur mit einem Textknoten angetroffen werden. Beispielsweise:
function xml2array($contents, $get_attributes =1, $priority ='tag'){if(!$contents)return array();if(!function_exists('xml_parser_create')){// print "'xml_parser_create()' function not found!";return array();}// Get the XML parser of PHP - PHP must have this module for the parser to work
$parser = xml_parser_create('');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING,"UTF-8");// http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE,1);
xml_parse_into_struct($parser, trim($contents), $xml_values);
xml_parser_free($parser);if(!$xml_values)return;//Hmm...// Initializations
$xml_array = array();
$parents = array();
$opened_tags = array();
$arr = array();
$current =& $xml_array;//Refference// Go through the tags.
$repeated_tag_index = array();//Multiple tags with same name will be turned into an arrayforeach($xml_values as $data){
unset($attributes, $value);//Remove existing values, or there will be trouble// This command will extract these variables into the foreach scope// tag(string), type(string), level(int), attributes(array).
extract($data);//We could use the array by itself, but this cooler.
$result = array();
$attributes_data = array();if(isset($value)){if($priority =='tag') $result = $value;else $result['value']= $value;//Put the value in a assoc array if we are in the 'Attribute' mode}// Set the attributes too.if(isset($attributes)and $get_attributes){foreach($attributes as $attr => $val){if( $attr =='ResStatus'){
$current[$attr][]= $val;}if($priority =='tag') $attributes_data[$attr]= $val;else $result['attr'][$attr]= $val;//Set all the attributes in a array called 'attr'}}// See tag status and do the needed.//echo"<br/> Type:".$type;if($type =="open"){//The starting of the tag '<tag>'
$parent[$level -1]=& $current;if(!is_array($current)or(!in_array($tag, array_keys($current)))){//Insert New tag
$current[$tag]= $result;if($attributes_data) $current[$tag .'_attr']= $attributes_data;//print_r($current[$tag . '_attr']);
$repeated_tag_index[$tag .'_'. $level]=1;
$current =& $current[$tag];}else{//There was another element with the same tag nameif(isset($current[$tag][0])){//If there is a 0th element it is already an array
$current[$tag][$repeated_tag_index[$tag .'_'. $level]]= $result;
$repeated_tag_index[$tag .'_'. $level]++;}else{//This section will make the value an array if multiple tags with the same name appear together
$current[$tag]= array(
$current[$tag],
$result
);//This will combine the existing item and the new item together to make an array
$repeated_tag_index[$tag .'_'. $level]=2;if(isset($current[$tag .'_attr'])){//The attribute of the last(0th) tag must be moved as well
$current[$tag]['0_attr']= $current[$tag .'_attr'];
unset($current[$tag .'_attr']);}}
$last_item_index = $repeated_tag_index[$tag .'_'. $level]-1;
$current =& $current[$tag][$last_item_index];}}
elseif ($type =="complete"){//Tags that ends in 1 line '<tag />'// See if the key is already taken.if(!isset($current[$tag])){//New Key
$current[$tag]= $result;
$repeated_tag_index[$tag .'_'. $level]=1;if($priority =='tag'and $attributes_data) $current[$tag .'_attr']= $attributes_data;}else{//If taken, put all things inside a list(array)if(isset($current[$tag][0])and is_array($current[$tag])){//If it is already an array...// ...push the new element into that array.
$current[$tag][$repeated_tag_index[$tag .'_'. $level]]= $result;if($priority =='tag'and $get_attributes and $attributes_data){
$current[$tag][$repeated_tag_index[$tag .'_'. $level].'_attr']= $attributes_data;}
$repeated_tag_index[$tag .'_'. $level]++;}else{//If it is not an array...
$current[$tag]= array(
$current[$tag],
$result
);//...Make it an array using using the existing value and the new value
$repeated_tag_index[$tag .'_'. $level]=1;if($priority =='tag'and $get_attributes){if(isset($current[$tag .'_attr'])){//The attribute of the last(0th) tag must be moved as well
$current[$tag]['0_attr']= $current[$tag .'_attr'];
unset($current[$tag .'_attr']);}if($attributes_data){
$current[$tag][$repeated_tag_index[$tag .'_'. $level].'_attr']= $attributes_data;}}
$repeated_tag_index[$tag .'_'. $level]++;//0 and 1 index is already taken}}}
elseif ($type =='close'){//End of tag '</tag>'
$current =& $parent[$level -1];}}return($xml_array);}// Let's call the this above function xml2array
xml2array($xmlContent, $get_attributes =3, $priority ='tag');// it will work 100% if not ping me @skype: sapan.mohannty// Enjoy coding
Ich mochte diese Frage und einige Antworten waren hilfreich für mich, aber ich muss die XML in ein Dominanz-Array konvertieren, damit ich meine Lösung veröffentlichen kann, vielleicht braucht es jemand später:
Antworten:
Eine weitere Option ist die SimpleXML-Erweiterung (ich glaube, sie ist bei den meisten PHP-Installationen Standard.)
http://php.net/manual/en/book.simplexml.php
Die Syntax sieht für Ihr Beispiel ungefähr so aus
quelle
[CDATA[TEXT]]
in einigen Elementen und sie analysieren nicht damit. Es analysiert es alsSimpleXMLElement Object
. Irgendeine Problemumgehung dafür?einfach!
quelle
TRUE
(normalerweise standardmäßigFALSE
) verwenden, um die JSON-Eingabe in ein assoziatives Array zu konvertieren.Konvertieren einer XML-Zeichenfolge (
$buffer
) in ein vereinfachtes Array, bei dem Attribute ignoriert und untergeordnete Elemente mit denselben Namen gruppiert werden:Ergebnis:
Wenn Sie die Attribute auch haben möchten, sind sie über die JSON-Codierung / -Decodierung von SimpleXMLElement verfügbar. Dies ist oft die einfachste und schnellste Lösung:
Ergebnis:
Beachten Sie, dass alle diese Methoden nur im Namespace des XML-Dokuments funktionieren.
quelle
&& (is_countable($node) && 1 === count($node) ? $node = array($node) : 1)
Allerdings habe ich in der nächsten Zeile einen Fehler bekommen :[] operator not supported for strings
.quelle
json_encode
und nichtjson_decode
.$array
Variable keine Textwerte enthält, liegt dies möglicherweise an CDATA. Laden Sie Ihr XML mit :new SimpleXMLElement($xml, LIBXML_NOCDATA)
.<?xml version="1.0" encoding="UTF-8"?><note a="b"><body c="d">Hello!</body></note>
. Führen Sie den Code aus und Sie werden sehen, dass das Attribut <body>c
verloren geht! Überprüfen Sie bitte den vollständigen Code hier , wenn Sie nicht schlecht wollen überrascht github.com/gaarf/XML-string-to-PHP-array/blob/master/... oder siehe meine Antwort unten stackoverflow.com/a/30234924/828366Siehe https://github.com/gaarf/XML-string-to-PHP-array/blob/master/xmlstr_to_array.php
quelle
Überrascht erwähnte niemand
xml_parse_into_struct
:quelle
Die in den akzeptierten Antwort-Drop-Attributen verwendete Methode, wenn untergeordnete Elemente nur mit einem Textknoten angetroffen werden. Beispielsweise:
Meine Lösung (und ich wünschte, ich könnte hier Anerkennung geben, weil ich sicher bin, dass ich dies von etwas angepasst habe):
quelle
XML To Array
Weitere Details finden Sie unter https://github.com/sapankumarmohanty/lamp/blob/master/Crate-XML-2-Array
// Konvertiere XML in Array und SOAP XML in Array
quelle
Ich mochte diese Frage und einige Antworten waren hilfreich für mich, aber ich muss die XML in ein Dominanz-Array konvertieren, damit ich meine Lösung veröffentlichen kann, vielleicht braucht es jemand später:
quelle