Внедрить XML в узел, используя строку - PullRequest
3 голосов
/ 11 ноября 2009

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

Смотрите мой код ниже. Спасибо !!!

$xml = simplexml_load_file($url);

    $questionGroup = $xml->qa[intval($id)];

    $children = array(); //  create empty array

    foreach ($questionGroup->children() as $element) {  //  loop thru children
        array_push($children, $element->asXML()); // save XML into array
    }
    //unset($questionGroup->answer);
    //unset($questionGroup->question);

    //create new node
    $newNode = '<answer><title>'.$title.'</title><description>'.$description.'</description><subName>'.$subName.'</subName><date>'.$date.'</date><timestamp>'.$timestamp.'</timestamp></answer>';

    echo "children count: ".count($children);
    echo "<br /><br />";
    print_r($children);
    echo "<br /><br />";
    // insert new
    array_splice($children,intval($elementIndex),0,$newNode);
    echo "children count: ".count($children);
    echo "<br /><br />";
    print_r($children);
    echo "<br /><br />";
    echo $questionGroup->asXML();
    foreach ($children as $element) {  //  loop thru array 
        echo "<br /><br />";
        echo $element;
        //$questionGroup->addChild(simplexml_load_string($element));  //  add array element to the empty questionGroup

    } 
        echo "<br /><br />";
    echo "questionGroup: ".$questionGroup;

UPDATE: Я нашел функцию, которую я изменил и смог начать работать:

function append_simplexml(&$simplexml_to, &$simplexml_from)
{
   $childNode = $simplexml_to->addChild($simplexml_from->getName(), "");
    foreach ($simplexml_from->children() as $simplexml_child)
    {
       $simplexml_temp = $childNode->addChild($simplexml_child->getName(), (string) $simplexml_child);
       foreach ($simplexml_child->attributes() as $attr_key => $attr_value)
       {
          $simplexml_temp->addAttribute($attr_key, $attr_value);
       }

      // append_simplexml($simplexml_temp, $simplexml_child);
    }
} 

С этим использованием в моем цикле foreach ():

foreach ($children as $element) {  //  loop thru array 
    append_simplexml($questionGroup, new SimpleXMLElement($element));
}

Ответы [ 3 ]

8 голосов
/ 12 ноября 2009

Вы не можете сделать это только с SimpleXML. Есть хороший способ сделать это с расширением DOM и классом DOMDocumentFragment. (Обратите внимание, что я не пытался понять вашу логику в представленном примере, но вы должны быть в состоянии внедрить простой пример ниже в ваш код).

$xml = simplexml_load_string('<root><parent/></root>');
// get the parent node under which you want to insert your XML fragement
$parent = dom_import_simplexml($xml->parent);
// create the XML fragment
$fragment = $parent->ownerDocument->createDocumentFragment();
// append the XML literal to your fragment
$fragment->appendXML('<child id="1"/><child id="2"><grandchild/></child>');
// append the fragment to the parent node
$parent->appendChild($fragment);
echo $xml->asXML();
/*
 * <?xml version="1.0"?>
 * <root><parent><child id="1"/><child id="2"><grandchild/></child></parent></root>
 */

Ссылки:

4 голосов
/ 13 ноября 2009

Я нашел функцию, которую я изменил и смог заставить работать:

function append_simplexml(&$simplexml_to, &$simplexml_from)
{
   $childNode = $simplexml_to->addChild($simplexml_from->getName(), "");
    foreach ($simplexml_from->children() as $simplexml_child)
    {
           $simplexml_temp = $childNode->addChild($simplexml_child->getName(), (string) $simplexml_child);
           foreach ($simplexml_child->attributes() as $attr_key => $attr_value)
       {
              $simplexml_temp->addAttribute($attr_key, $attr_value);
       }

      // append_simplexml($simplexml_temp, $simplexml_child);
    }
}

С этим использованием в моем цикле foreach ():

foreach ($children as $element) {  //  loop thru array 
    append_simplexml($questionGroup, new SimpleXMLElement($element));
}
0 голосов
/ 11 ноября 2009

Вы должны быть в состоянии сделать что-то вроде этого:

$child = new SimpleXMLElement($newNode);

$yourxmlobject->addChild($child);
...