用PHP更新XML节点

用PHP更新XML节点,php,xml,simplexml,Php,Xml,Simplexml,我有一个XML文件test.XML <?xml version="1.0"?> <info> <user> <name> <firstname>FirstName</firstname> <lastname>Last Name</lastname> <nameCoordinate> <xName>125</x

我有一个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>

名字
姓
125
20
我试图在表单提交中使用PHP更新节点xName&yName。因此,我使用simplexml\u load\u 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";
?>
info->user->name->namecordinate->xName=$xPostName;
$xml->info->user->name->namecordinate->yName=$yPostName;
回应“完成”;
?>

我想更新节点值,但上面的代码似乎不正确。谁能帮我纠正一下吗

更新:
我的问题与此类似,但在这里,我从外部文件加载XML,并且更新元素,而不是属性。这就是我的困惑所在。

您必须将更改写回文件,使用SimpleXMLElement的方法。

您没有访问正确的节点。在您的示例中,
$xml
保存根节点
。这里有一个很好的提示:始终将保存XML文档的变量命名在其根节点之后,这样可以防止这种混淆

另外,正如Ward Muylaert指出的,您需要保存该文件

下面是正确的示例:

// 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');
//加载文档
//根节点不可用,因此我们将其加载到$info中
$info=simplexml_load_文件('test.xml');
//更新
$info->user->name->namecordinate->xName=$xPostName;
$info->user->name->namecordinate->yName=$yPostName;
//保存更新的文档
$info->asXML('test.xml');
像这样试试

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

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


这可能不是最好的答案,但对我来说很有效。

什么不符合预期?您没有解释错误。我要更新节点值。这没有发生。我已经更新了上面的问题。我相信这会重写整个标签。我只想更新特定的节点。确实如此,但如果不在自己的代码中编写一半的XML解释逻辑来只编写特定的节点,我相信这就是SimpleXML所能做到的。如果xName或yName节点不存在,会发生什么?如果您有多个用户使用多个yName,并且希望同时编辑所有用户,会发生什么?有什么想法吗?