Добавить узел в XML перед сохранением

как добавить узел xml <TypeId>HDU5K3KDI23F</TypeId> в верхний узел переменной XML перед сохранением.
Данные XML, которые я получаю, поступают из API в качестве ответа.
Когда я использую приведенный ниже код, данные ответа xml получают сохраняется, но узел Typeid не сохраняется в этом файле.

Данные ответа XML выглядят так

        <GetCategories>
           <GetProduct>
               <Data>
                  <Id>87772873</Id>
                  <Name>Foods and Beverages</Name>
                  <Top>
                  <CategoryId>028392323</CategoryId>
                  <CategoryName>Categories</CategoryName> 
                  </Top>
               </Data>
           </GetProduct>
       </GetCategories>

Код

        $dom = new DOMDocument;
        $dom->loadXML($response->toXML());  
        $dom->preserveWhiteSpace = FALSE;

        $Xpath = new DOMXpath($dom);

        foreach ($Xpath->evaluate('/GetCategories/GetProduct/Data/Top[1]') as $data) 
         {
            $type = $data->appendChild($dom->createElement('TypeId'));
            $type->appendChild($dom->createTextNode('HDU5K3KDI23F'));
         }

           $dom->formatOutput = TRUE;
           $xmldata = $dom->saveXML();
           echo $xmldata;

        $myfile = file_put_contents('data.xml', $xmldata.PHP_EOL , FILE_APPEND | LOCK_EX);

person Community    schedule 31.08.2018    source источник
comment
FILE_APPEND нарушит xml: Хорошо: 3v4l.org/Tds8t Плохо: 3v4l.org/SMOft   -  person Lawrence Cherone    schedule 31.08.2018
comment
@Lawrence Cherone, на самом деле данные находятся в цикле, поэтому он добавляет файл внутри того же файла ... и я думаю, почему этот код не работает ... так, как вы, я тоже работал на меня, но для меня у меня есть массив идентификаторов, и я хочу добавить эти идентификаторы в качестве узла в xml и сохранить его, затем снова взять следующий идентификатор и зациклить то же самое и добавить в тот же файл.   -  person    schedule 31.08.2018
comment
Не добавляйте его, так как saveXML включает заголовок, который его сломает. Если ваш цикл затем загрузите файл, переберите GetProduct, добавьте идентификатор, затем сохраните.   -  person Lawrence Cherone    schedule 31.08.2018
comment
@Lawrence Cherone, Ок, вы говорите, что пусть весь процесс завершится ... затем загрузите XML-файл и переберите GetProducts, добавьте идентификатор, сохранение. Правильно.?   -  person    schedule 31.08.2018
comment
Да, покажите реальный пример данных, которые вы хотите вставить в xml (поскольку вы не хотите вставлять один и тот же идентификатор во все элементы), и я отправлю ответ.   -  person Lawrence Cherone    schedule 31.08.2018
comment
@Lawrence Cherone, пожалуйста, посмотрите, я добавил полный заголовок окончательного файла, а также массив данных, которые я хочу добавить ... 3v4l.org/8lL1O   -  person    schedule 31.08.2018


Ответы (1)


Измените код в foreach следующим образом: Сначала создайте элемент со значением и добавьте его к своим данным.

foreach ($Xpath->evaluate('/GetCategories/GetProduct/Data/Top[1]') as $data) 
{
    $type = $dom->createElement('TypeId', 'HDU5K3KDI23F');
    $data->appendChild($type);
}
person balakrishnan    schedule 31.08.2018