2017-10-22 11 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); 

} 

私は」 1つのタイプのSimpleXMLElementを別のタイプに渡すことができない理由がわかりません。いくつかのタイプの名前空間が必要ですか?どんな助けもありがとう。

+0

XMLと望ましい結果の両方の例を示してください。 – Parfait

答えて

0

あなたにはいくつか問題があります。主なエラーの原因となっている最初は

$tradeshows = $doc->Tradeshows; 

あなたは、これはあなたが期待したノードを与えていることを確認する必要があります...、私は信じて、回線に問題です。あなたの文書は(例えば)

<Tradeshows> 
</Tradeshows> 

されている場合は、$展示会は、ちょうど

$tradeshows = $doc; 

でなければなりません。しかし、実際のXMLせずに、それは伝えることは困難です。しかし、これはあなたが '親は永久的なメンバーではありません'というビットを修正できるはずです。

第2に、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

ありがとう、これは役に立ちました。最初のケースでは、2つのTradeshowノードがあったので、 '$ doc-> Tradeshows'は私が期待したものを返せませんでした。私は '$ doc-> en-> Tradeshows'に変更し、私が望むものを得ました。 2番目のケースでは、コードが完全に機能しました。ありがとうございます。 –

関連する問題