2017-10-22 125 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',并得到了我想要的。 在第二种情况下,您的代码完美工作,谢谢。 –