2017-10-22 104 views
0

我試圖從另外一個添加到一個的SimpleXMLElement,但我得到的錯誤:PHP拉,轉換成XML,並追加到現有的XML文檔

Warning: SimpleXMLElement::addChild(): Cannot add child. Parent is not a permanent member of the XML tree

$xml = $Global->serializeTradeShowTable(); 
$xmlDeser = simplexml_load_string($xml); 

$doc = simplexml_load_file($path); 
$tradeshows = $doc->Tradeshows; 

foreach($xmlDeser->item as $item) 
{ 

    $name = (string)$item->friendlyName; 
    $formatted_name = str_replace(' ', '_', $name); 

    $sxe = new \SimpleXMLElement("<option></option>"); 
    $sxe->addAttribute('name', $formatted_name); 
    $sxe->addAttribute('value', $name); 
    $sxe[0] = $name; 

    $tradeshows->addChild($sxe); 

} 

我米不知道爲什麼我不能將一種類型的SimpleXMLElement傳遞給另一個。是否需要某種類型的命名空間?任何幫助,將不勝感激。

+0

請顯示XML和期望結果的示例。 – Parfait

回答

0

你有幾個問題。導致主要錯誤的第一個問題是,我相信,線路有問題...

$tradeshows = $doc->Tradeshows; 

您需要檢查這是否爲您提供了期望的節點。如果你的文件是(例如)

<Tradeshows> 
</Tradeshows> 

然後$展覽會應該是隻是

$tradeshows = $doc; 

但是,如果沒有實際的XML,這是很難說。但這是你應該能夠糾正'家長不是永久成員'的位置。

其次,addChild採用元素的名稱和可選的值。您嘗試添加在的SimpleXMLElement。如果你有改變你的代碼...

foreach($xmlDeser->item as $item) 
{ 
    $name = (string)$item->friendlyName; 
    $formatted_name = str_replace(' ', '_', $name); 

    $newElement = $tradeshows->addChild("option"); 
    $newElement->addAttribute('name', $formatted_name); 
    $newElement->addAttribute('value', $name); 
} 

這應該添加<option>,然後設置屬性。

+0

謝謝,這很有幫助。在第一種情況下,有兩個Tradeshow節點,所以'$ doc-> Tradeshows'沒有返回我所期望的。我將它改爲'$ doc-> en-> Tradeshows',並得到了我想要的。 在第二種情況下,您的代碼完美工作,謝謝。 –