2009-12-01 4 views
4

У меня есть этот SimpleXMLElement объект с установкой XML, подобную следующей ...Добавление блока XML в качестве дочернего объекта SimpleXMLElement

$xml = <<<EOX 
<books> 
    <book> 
     <name>ABCD</name> 
    </book> 
</books> 
EOX; 

$sx = new SimpleXMLElement($xml); 

Теперь у меня есть класс с именем книги, которая содержит в себе информацию. о каждой книге. Тот же класс также может выплюнуть информацию о книге. в формате XML Акин выше (вложенный блок) .. например,

$book = new Book('EFGH'); 
$book->genXML(); 

... will generate 
<book> 
    <name>EFGH</name> 
</book> 

Теперь я пытаюсь выяснить способ, с помощью которого я могу использовать этот сгенерированный XML-блок и добавляемый в детстве так, что Теперь это выглядит как ... например ..

// Non-existent member method. For illustration purposes only. 
$sx->addXMLChild($book->genXML());  

...XML tree now looks like: 
<books> 
    <book> 
     <name>ABCD</name> 
    </book> 
    <book> 
     <name>EFGH</name> 
    </book> 
</books> 

Из того, что документация я прочитал на SimpleXMLElement, AddChild() не получить это сделать для вас, как он не поддерживает данные XML в качестве тега стоимость.

+0

Связанный: [Есть ли способ добавить PHP SimpleXMLElement в другой SimpleXMLElement?] (Http://stackoverflow.com/q/1157104/367456) – hakre

ответ

4

Два решения. Во-первых, вы делаете это с помощью Libxml/DOMDocument/SimpleXML: вы должны импортировать $sx объект DOM, создать DOMDocumentFragment и использовать DOMDocumentFragment::appendXML():

$doc = dom_import_simplexml($sx)->ownerDocument; 

$fragment = $doc->createDocumentFragment();  
$fragment->appendXML($book->genXML()); 
$doc->documentElement->appendChild($fragment); 

// your original $sx is now already modified. 

См Online Demo.

Вы также можете продлить от SimpleXMLElement и добавить способ, который предоставляет это. Используя этот специализированный объект затем позволит вам легко создать следующее:

$sx = new MySimpleXMLElement($xml); 

$sx->addXML($book->genXML()); 

Другим решением является использование библиотеки XML, который уже имеет эту функцию встроенного как SimpleDOM. Вы захватываете SimpleDOM, и вы используете insertXML(), который работает как метод addXMLChild(), который вы описывали.

include 'SimpleDOM.php'; 

$books = simpledom_load_string(
    '<books> 
     <book> 
      <name>ABCD</name> 
     </book> 
    </books>' 
); 

$books->insertXML(
    '<book> 
     <name>EFGH</name> 
    </book>' 
); 
+0

Я бы пошел на первый метод, поскольку он не включает любые внешние библиотеки. Немного поработал с кодом и сумел выяснить точную последовательность кода. Благодарю. Это помогло bigtime :) –

+0

Пожалуйста, внесите в него точную последовательность кода, если у вас все еще есть ...! – maralbjo

+0

Привет, ребята, я добавил пример кода, который показывает, как это работает, включая онлайн-демонстрацию. Я не знаю, почему это не было сделано за последние три с половиной года, так как это Q & A показывает базовую и полезную концепцию. У всех вас мог быть супер секретный код;) - И да, в наши дни * SimpleDOM * совершенно лишний в моих глазах. – hakre

3

Посмотрите на мой код:

$doc = new DOMDocument();  
$doc->loadXML("<root/>");  

$fragment = $doc->createDocumentFragment();  
$fragment->appendXML("<foo>text</foo><bar>text2</bar>"); 
$doc->documentElement->appendChild($fragment); 

echo $doc->saveXML(); 

Это изменяет документ XML путем добавления фрагмента XML. Online Demo.

+1

Ваш код в порядке и работоспособности: http://eval.in/17709 - Просто удалите часть о сохранении на данный момент, у вас есть XML-модифицирующая, несвязанная проблема сохранения на диск, которую вы должны разместить в другом вопросе. – hakre

+0

@hakre saveXML возвращает строку, она фактически не сохраняет ее на диске. – oskarth

 Смежные вопросы

  • Нет связанных вопросов^_^