SimpleXMLElement — экземпляр addChild

#php #xml

#php #xml

Вопрос:

У меня есть 2 экземпляра SimpleXMLElement, например:

 $xmlMain = new SimpleXmlElement('<user><name></name></user>');

$xmlPart = new SimpleXmlElement('<user_details...</user_details>');
  

Могу ли я вставить $xmlPart элемент где-нибудь внутри $xmlMain .

Я хочу, чтобы результатом было внедрение $xmlPart экземпляра внутрь $xmlMain , чтобы результат был

 <user><name><user_details>...</user_details></name></user>
  

Ответ №1:

SimpleXML не очень хорош при копировании данных с одного узла на другой. Вместо этого вы можете использовать методы DOMDocument, сначала импортировав SimpleXMLElements в DOMNodes, затем импортировав второй узел в документ для первого узла, а затем добавив его к элементу name…

 $xmlMain = new SimpleXmlElement('<user><name></name></user>');

$xmlPart = new SimpleXmlElement('<user_details>...</user_details>');

// Import xmlMain <name> element into a DOMNode
$xmlMD = dom_import_simplexml($xmlMain->name);
// Import xmlPart into DOMNode and then import that node into the xmlMD document
$importedNode = $xmlMD->ownerDocument->importNode(dom_import_simplexml($xmlPart), true);
// Add the imported node into the first node (the <name> element)
$xmlMD->appendChild($importedNode);

echo $xmlMain->asXML();
  

Это даст…

 <?xml version="1.0"?>
<user><name><user_details>...</user_details></name></user>
  

Альтернативой, которая могла бы быть проще, является создание $xmlPart элемента в $xmlMain документе в первую очередь…

 $xmlMain = new SimpleXmlElement('<user><name></name></user>');
$userDetails = $xmlMain->name->addChild("user_details");
$userDetails->addChild("name", "Fred");

echo $xmlMain->asXML();
  

создает…

 <?xml version="1.0"?>
<user><name><user_details><name>Fred</name></user_details></name></user>