2011-11-07 35 views
0

我想從常用數組中生成xml數據。如果節點名稱相同,PHP XML Writer不生成xml

我的陣列

$data = array(
    'item' => array(
     'id' => '1', 
     'name' => 'bar1', 
     'price' => '10', 
     'description' => '', 
     'image_link_small' => '', 
     'image_link_big' => '' 
    ), 
    'item' => array(
     'id' => '2', 
     'name' => 'bar2', 
     'price' => '20', 
     'description' => '', 
     'image_link_small' => '', 
     'image_link_big' => '' 
    ), 
    'item' => array(
     'id' => '3', 
     'name' => 'bar3', 
     'price' => '30', 
     'description' => '', 
     'image_link_small' => '', 
     'image_link_big' => '' 
    ), 
    'item' => array(
     'id' => '4', 
     'name' => 'bar4', 
     'price' => '40', 
     'description' => '', 
     'image_link_small' => 'link1', 
     'image_link_big' => 'link2' 
    ) 
); 

我的PHP陣列,以XML轉換代碼是

public function convertArrayToXML($data, $rootElement = 'root', $startDoc = '1.0', $xml_encoding = 'UTF-8') { 
     $xml = new XmlWriter(); 
     $xml->openMemory(); 
     $xml->startDocument($startDoc, $xml_encoding); 
     $xml->startElement($rootElement); 

     function write(XMLWriter $xml, $data) { 
      foreach ($data as $key => $value) { 
       if (is_array($value)) { 
        $xml->startElement($key); 
        write($xml, $value); 
        $xml->endElement(); 
        continue; 
       } 
       $xml->writeElement($key, $value); 
      } 
     } 

     write($xml, $data); 

     $xml->endElement(); 
     return $xml->outputMemory(true); 
    } 

但它給我輸出XML只有最後一個節點...

<root> 
<item> 
<id>4</id> 
<name>bar4</name> 
<price>40</price> 
<description/> 
<image_link_small>link1</image_link_small> 
<image_link_big>link2</image_link_big> 
</item> 
</root> 

如果我將項目排列爲item1,item2,它em3,item4它給我 正確的xml數據。可能是什麼問題?

謝謝你

+0

到XML轉換是做什麼它應該用數據做你正在給它。在定義數組後立即嘗試轉儲數組。您會發現每個元素覆蓋之前的元素,因爲每個元素具有相同的名稱,只留下最後一個元素。 – Jason

回答

1

這不是一個XML編寫器問題。嘗試

var_dump($data);

你會看到這個問題。您不能在PHP數組中使用多次相同的密鑰。

+0

那麼我怎麼能實現我的XML數據中的多個項目節點? – KillerFish

+0

爲你的數組增加另一個「維度」:'item'=> array(array(id => 2,...),array(id => 3,...)) – VolkerK

+0

或者如果你知道這個數組只有項目,只需重命名數組:$ items => array(array('id'=> 1 ...),...) – Marko

1

$data數組的鍵值是相同的,這就是爲什麼前三個值由去年value.try像覆蓋:

$data = array(
    'item1' => array(.....), 
    'item2' => array(.....), 
    'item2' => array(.....) 
) 
相關問題