2011-07-02 6 views
1

私は、PHP配列をXMLに変換する必要のある単純なスクリプトを作成しようとしていますが、動作させることはできません。配列に次元が1つしかない場合や、より多くの寸法は、すべてのノードが「ルート」ノードに追加されsimpleXMLスクリプト

#class 
    class XML { 
     private $root = '<response />'; 

     function __construct($root=null){ 
      $this->root = new SimpleXMLElement($root ? $root:$this->root); 
     } 

     function encode($arr, $node=null){ 
      $node = $node ? $node:$this->root; 
      foreach($arr as $key => $value){ 
       if(is_array($value)){ 
        $this->encode($value, $node->addChild($key)); 
       } 
       else{ 
        $node->addChild($key, $value); 
       } 
      } 
     } 

     function output(){ 
      return $this->root->asXML(); 
     } 
    } 


#code 

    $arr = array(
     'test' => 'noget', 
     'hmmm' => 12, 
     'arr' => array(
      99 => 'haha', 
      'arr2' => array(
       ), 
      'dd' => '333' 
      ) 
     ); 
    print_r($arr); 
    require_once '../class/class.XML.php'; 
    $XML = new XML(); 
    $XML->encode($arr); 
    echo $XML->output(); 

#output 

    Array 
    (
     [test] => noget 
     [hmmm] => 12 
     [arr] => Array 
      (
       [99] => haha 
       [arr2] => Array 
        (
        ) 

       [dd] => 333 
      ) 

    ) 
    <?xml version="1.0"?> 
    <response><test>noget</test><hmmm>12</hmmm><arr/><99>haha</99><arr2/><dd>333</dd></response> 

答えて

1

あなたは、コードを使用すると、より慎重にオプション$nodeのパラメータをチェックしなければならない、しかし、あなたはそれがやりたいことは非常に正常に見えるです:

function encode($arr, $node=null){ 
    $node = $node ? $node:$this->root; 

私はそれを次のようにすることができます:

function encode($arr, $node=null){ 
    $node = null === $node ? $this->root : $node; 

空のSimpleXML要素はfalsesee the last point in this Converting to boolean list)であり、あなたが空の子を追加すると、それは常にfalseだと、あなたがルート要素に再び追加しました。