2012-11-04 30 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>             */