Обновление узла XML с помощью PHP

У меня есть XML-файл test.xml

<?xml version="1.0"?>
<info>
  <user>
    <name>
      <firstname>FirstName</firstname>
      <lastname>Last Name</lastname>
      <nameCoordinate>
        <xName>125</xName>
        <yName>20</yName>
      </nameCoordinate>
    </name>
  </user>
</info>

Я пытаюсь обновить узел xName и yName с помощью PHP при отправке формы. Итак, я загрузил файл с помощью simplexml_load_file (). Код действия формы PHP приведен ниже.

<?php 
    $xPostName = $_POST['xName'];
    $yPostName = $_POST['yName'];

    //load xml file to edit
        $xml = simplexml_load_file('test.xml');

    $xml->info->user->name->nameCoordinate->xName = $xPostName;
    $xml->info->user->name->nameCoordinate->yName = $yPostName;
    echo "done";
?>

Я хочу обновить значения узлов, но приведенный выше код кажется неверным. Может ли кто-нибудь помочь мне исправить это?

ОБНОВЛЕНИЕ: мой вопрос несколько похож на этот Обновление файла XML с помощью PHP, но здесь я загружаю XML из внешнего файла, а также обновляю элемент, а не атрибут. Вот в чем мое замешательство.


person ptamzz    schedule 20.01.2011    source источник
comment
что не работает должным образом? у вас нет объяснения ошибки.   -  person Samuel Herzog    schedule 20.01.2011
comment
Я хочу обновить значения узлов. Этого не происходит.   -  person ptamzz    schedule 20.01.2011
comment
Я обновил свой вопрос выше.   -  person ptamzz    schedule 20.01.2011


Ответы (3)


Вы не получаете доступ к нужному узлу. В вашем примере $xml содержит корневой узел <info/>. Вот отличный совет: всегда называйте переменную, в которой хранится ваш XML-документ, после его корневого узла, это предотвратит такую ​​путаницу.

Кроме того, как указал Уорд Муйларт, вам необходимо сохранить файл.

Вот исправленный пример:

// load the document
// the root node is <info/> so we load it into $info
$info = simplexml_load_file('test.xml');

// update
$info->user->name->nameCoordinate->xName = $xPostName;
$info->user->name->nameCoordinate->yName = $yPostName;

// save the updated document
$info->asXML('test.xml');
person Josh Davis    schedule 20.01.2011
comment
Что произойдет, если узел xName или yName еще не существует? - person swl1020; 25.03.2013
comment
Что делать, если у вас есть несколько пользователей с несколькими yName и вы хотите редактировать их всех сразу? Есть предположения? - person user906379; 09.07.2015

Вы должны записать изменения обратно в файл, используйте asXML объекта SimpleXMLElement.

person Ward Muylaert    schedule 20.01.2011
comment
Я считаю, что переписывает целые теги. Я хочу обновить только определенные узлы. - person ptamzz; 20.01.2011
comment
Это так, но если не писать половину логики интерпретации XML в вашем собственном коде для записи только определенных узлов, я считаю, что это все, что вы можете сделать с SimpleXML. - person Ward Muylaert; 20.01.2011

попробуйте вот так.

$xmlDoc = new \DOMDocument;
$xmlDoc->load('Books.xml');
$response = $xmlDoc->getElementsByTagName('Text');

foreach ($response as $node){
        $node->nodeValue = 'test';
    }
$xmlDoc->saveXML();

Возможно, это не лучший ответ, но у меня он сработал.

person Ruhith Udakara    schedule 27.12.2019