2012-11-04 64 views
0

我有一個數組,我需要使用SimpleXML將其轉換爲XML。下面的方法幾乎可以完成這項工作,但它有一個問題。它不能產生結構是這樣的:php:導出數組到XML問題

$xmlFields = array( 
     'rootElt' => array(
      'field1' => '', 
      'field2' => '',     
      'field3' => array(     
       'field4' => array(
        'income' => array(
         'owner' => '',        
         'description' => '', 
        ), 
        'income' => array(
         'owner' => '',        
         'description' => '', 
        ), 
       ), 
      ) 
     ) 
    ); 

它僅寫入部分「字段4」最後的收入「,但我需要一個像輸出:

<field4> 
    <income> 
     <owner>....</owner>    
     <description>....</description> 
    </income> 
    <income> 
     <owner>....</owner>    
     <description>....</description> 
    </income> 
</field4> 

有人能幫助我解決這個功能:

/**  
* @param array $dataArr 
* @param SimpleXMLElement $xmlObj 
*/ 
private function array2xml($dataArr, $xmlObj) { 
    foreach ($dataArr as $key => $value) {   
     if (is_array($value)) {       
      if (!is_numeric($key)) {      
       $subnode = $xmlObj->addChild($key);      
       self::array2xml($value, $subnode);      
      } else {           
       self::array2xml($value, $xmlObj);  
      } 
     } else { 
      $xmlObj->addChild($key, $value);      
     } 
    } 
} 
+0

它似乎是爲我工作。你如何調用函數? –

回答

1

的代碼看起來不錯SimpleXML中的條款,但你有一個誤解陣列在PHP中是如何工作的:

'field4' => array(
    'income' => array(
     'owner' => '',        
     'description' => '', 
    ), 
    'income' => array(
     'owner' => '',        
     'description' => '', 
    ), 

這不是將兩個值添加到field4陣列,而是一個。見http://php.net/array,例如示例#2income密鑰的第二個定義取代了第一個。

可能想在這種情況下,做的是使用不同的結構與數組:如果換一個數組元素它自己內部的每個元素

'field4' => array(
    array('income' => array(
     'owner' => '',        
     'description' => '', 
    )), 
    array('income' => array(
     'owner' => '',        
     'description' => '', 
    )), 

,你的代碼甚至會不會有任何特殊情況,因爲每個元素是相同的。然而,這意味着你會 - 如果你手工創建數組 - 編寫更多的代碼來定義它。

想到的另一種方法是這樣的:

'field4' => array(
    'income' => array(
     array(
      'owner' => '',        
      'description' => '', 
     ), 
     array(
      'owner' => '',        
      'description' => '', 
     ),    
    ), 

這仍然不是你允許有相同的元素名稱的多個組,但寫這將是可能更容易。

對於後面的數組結構(我想這就是你想使用的),我創建了一個simplexml數組導入器/轉換器(Gist)。在基本形式中使用非常簡單,但你可以用它做更多的差異化的東西:

/* Example 1: Create a new SimpleXMLElement based on an array */ 

$import = new SimpleXMLArrayImport(); 

$xml = $import->importArray(['root' => '']); 

/* <?xml version="1.0"?> 
* <root/>             */ 

/* Example 2: Add an empty child element to the root   */ 

$new = $import->addArray($xml, ['numbers' => '']); 

/* <?xml version="1.0"?> 
* <root> 
* <numbers/> 
* </root>             */ 

/* Example 3: Add a list of same-named elements to the root */ 

$last = $import->addArray($new, ['number' => [0, 1, 42]]); 

/* <?xml version="1.0"?> 
* <root> 
*  <numbers> 
*   <number>0</number> 
*   <number>1</number> 
*   <number>42</number> 
*  </numbers> 
* </root>             */ 

/* Example 4: Set attribute of last added element    */ 

$last['note'] = 'The Answer to the Ultimate Question of Life, the Universe, and Everything'; 

/* <?xml version="1.0"?> 
* <root> 
* <numbers> 
*  <number>0</number> 
*  <number>1</number> 
*  <number note="The Answer to the ...">42</number> 
* </numbers> 
* </root>             */ 

/* Example 5: Create a full document       */ 

$xmlFields = array(
    'rootElt' => array(
     'field1' => '', 
     'field2' => '', 
     'field3' => array(
      'field4' => array(
       'income' => array(
        array(
         'owner'  => '', 
         'description' => '', 
        ), 
        array(
         'owner'  => '', 
         'description' => '', 
        ), 
       ), 
      ), 
     ) 
    ) 
); 

$import = new SimpleXMLArrayImport($xmlFields); 

$xml = $import->getDocument(); # The SimpleXML Root Element 

/* <?xml version="1.0"?> 
* <rootElt> 
* <field1/> 
* <field2/> 
* <field3> 
*  <field4> 
*  <income> 
*   <owner/> 
*   <description/> 
*  </income> 
*  <income> 
*   <owner/> 
*   <description/> 
*  </income> 
*  </field4> 
* </field3> 
* </rootElt>             */