2016-05-15 5 views
0

Ich habe das folgende Array. Ich bin nicht einmal sicher, ob dieses Array richtig formatiert ist. Ich bin mir nicht einmal sicher, ob meine Anordnung stimmt.Konvertieren Sie eine PHP-Datenstruktur in serialisierte XML

Ich möchte das folgende Array zu einem serialisierten XML mit PHP konvertieren. Ich verwende attr tag für die Attribute. Hier

ist das Array:

$data = Array(
'name' => 'account', 
'attr' => Array(
    'id' => 123456 
), 
'children' => Array(
    Array(
     'name' => 'name', 
     'attr' => Array(), 
     'children' => Array(
      'BBC' 
     ), 
    ), 
    Array(
     'name' => 'monitors', 
      'attr' => Array(), 
     'children' => Array(
      Array(
       'name' => 'monitor', 
       'attr' => Array(
        'id' => 5235632 
       ), 
       'children' => Array(
        Array(
         'name' => 'url', 
         'attr' => Array(), 
         'children' => Array(
          'http://www.bbc.co.uk/' 
         ) 
        ) 
       ) 
      ), 
      Array(
       'name' => 'monitor', 
       'attr' => Array(
        'id' => 5235633 
       ), 
       'children' => Array(
        Array(
         'name' => 'url', 
         'attr' => Array(), 
         'children' => Array(
          'http://www.bbc.co.uk/news' 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
) 
); 
+0

Mögliche Duplikat von [Wie Array SimpleXML konvertieren] (http://stackoverflow.com/questions/1397036/how-to-convert-array-to-simplexml) –

+0

Diese Frage ist nicht so klar, - Fragst du nur, ob das Array gültig ist oder wie man eine XML-Konvertierung durchführt? In Bezug auf die Überprüfung Array ist gültig - ich würde einfach versuchen var_dump ($ Daten) und überprüfen Sie erhalten Ausgabe in der ersten Instanz nach der Definition. Running php -l wird angezeigt, wenn es einen Parse-Fehler gibt, aber nicht so hilfreich, es zu finden. P.S. Das von Ihnen gepostete Array-Objekt ist gültig. php –

+0

Wie wird die XML-Konvertierung durchgeführt? –

Antwort

1

Versuchen Sie die folgende Funktion

function assocArrayToXML($root_element_name,$ar) 
{ 
    $xml = new SimpleXMLElement("<?xml version=\"1.0\"?><{$root_element_name}></{$root_element_name}>"); 
    $f = function($f,$c,$a) { 
      foreach($a as $k=>$v) { 
       if(is_array($v)) { 
        $ch=$c->addChild($k); 
        $f($f,$ch,$v); 
       } else { 
        $c->addChild($k,$v); 
       } 
      } 
    }; 
    $f($f,$xml,$ar); 
    return $xml->asXML(); 
} 


echo assocArrayToXML("root",$data); 

test it here

+0

Verwenden Sie 'create_function()' nicht, es ist ein verstecktes 'eval()'. Verwenden Sie eine [anonyme Funktion] (http://www.php.net/manual/en/functions.anonymous.php). – ThW

+0

@ThW kannst du bitte die down-stimme entfernen, diese könnte gerade als kommentar –

+0

ausgegeben worden sein Die ausgabe von dir methode ist immer noch kaputt XML. Sie haben numerische Tag-Namen. * btw * Versuchen Sie es mit einer URL mit einem '&' drin. – ThW

1

Es ist ganz einfach mit einer rekursiven Funktion. Ihr Basisarray enthält 3 Elemente, den Namen, die Attributliste und die untergeordneten Elemente. Ihre Funktion muss also einen Knoten mit dem Namen erstellen und anhängen, alle Attribute festlegen und die untergeordneten Daten wiederholen. Wenn das Kind ein Skalar ist, ist es ein Textknoten, für ein Array rufen Sie die Funktion selbst auf.

function appendTo($parent, $data) { 
    $document = $parent->ownerDocument ?: $parent; 
    $node = $parent->appendChild($document->createElement($data['name'])); 
    if (isset($data['attr']) && is_array($data['attr'])) { 
    foreach ($data['attr'] as $name => $value) { 
     $node->setAttribute($name, $value); 
    } 
    } 
    if (isset($data['children']) && is_array($data['children'])) { 
    foreach ($data['children'] as $name => $childData) { 
     if (is_scalar($childData)) { 
     $node->appendChild($document->createTextNode($childData)); 
     } elseif (is_array($childData)) { 
     appendTo($node, $childData); 
     } 
    } 
    } 
} 

$document = new DOMDocument(); 
$document->formatOutput = TRUE; 
appendTo($document, $data); 

echo $document->saveXml(); 

Ausgang:

<?xml version="1.0"?> 
<account id="123456"> 
    <name>BBC</name> 
    <monitors> 
    <monitor id="5235632"> 
     <url>http://www.bbc.co.uk/</url> 
    </monitor> 
    <monitor id="5235633"> 
     <url>http://www.bbc.co.uk/news</url> 
    </monitor> 
    </monitors> 
</account> 
0

Hope this helfen.

<?php 
function array2xml($arr) 
{ 
    $dom = new DomDocument('1.0'); 
    /* 
    *Create Root 
    */ 
    $root = $dom->createElement($arr['name']); 
    if(isset($arr['attr']) && !empty($arr['attr'])) 
    { 
     foreach($arr['attr'] as $key=>$val) 
     $root->setAttribute($key, $val); 
    } 
    $root = $dom->appendChild($root); 
    createChilds($arr['children'], $dom, $root); 

    header('Content-type: text/xml'); 
    echo $dom->saveXML(); 
} 
function createChilds($arr, $dom, $parent) 
{ 
    foreach($arr as $child) 
    { 
     if(isset($child['name'])) 
      $node = $dom->createElement($child['name']); 
     /* 
     *Add Attributes 
     */ 
     if(isset($child['attr']) && !empty($child['attr'])) 
     { 
      foreach($child['attr'] as $key=>$val) 
      $node->setAttribute($key, $val); 
     } 
     /* 
     *Add Childs Recursively 
     */  
     if(isset($child['children']) && is_array($child['children'])) 
     { 
      createChilds($child['children'], $dom, $node); 
     } 
     else if(isset($child) && is_string($child)) 
     { 
      $text = $dom->createTextNode($child); 
      $parent->appendChild($text); 
     } 
     if(isset($node)) 
     $parent->appendChild($node); 
    } 
} 

$data = Array(
'name' => 'account', 
'attr' => Array(
    'id' => 123456 
), 
'children' => Array(
    Array(
     'name' => 'name', 
     'attr' => Array(), 
     'children' => Array(
      'BBC' 
     ), 
    ), 
    Array(
     'name' => 'monitors', 
      'attr' => Array(), 
     'children' => Array(
      Array(
       'name' => 'monitor', 
       'attr' => Array(
        'id' => 5235632 
       ), 
       'children' => Array(
        Array(
         'name' => 'url', 
         'attr' => Array(), 
         'children' => Array(
          'http://www.bbc.co.uk/' 
         ) 
        ) 
       ) 
      ), 
      Array(
       'name' => 'monitor', 
       'attr' => Array(
        'id' => 5235633 
       ), 
       'children' => Array(
        Array(
         'name' => 'url', 
         'attr' => Array(), 
         'children' => Array(
          'http://www.bbc.co.uk/news' 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
) 
); 
array2xml($data); 
?> 
+0

Wo ist die Erklärung? Bitte fügen Sie einen Punkt oder Kommentare hinzu, um Ihren Code selbsterklärend zu machen. – surajsn

Verwandte Themen