使用PHP更新XML节点

14

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

我正在尝试使用PHP在表单提交时更新节点xName和yName。因此,我已经使用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";
?>

我想更新节点的值,但是上面的代码似乎是不正确的。有人能帮我纠正吗?
更新: 我的问题与这个使用PHP更新XML文件有些相似,但是在这里,我从外部文件加载XML,并且我正在更新一个元素,而不是属性。这就是我困惑的地方。

你的程序出现了什么问题?你没有解释错误。 - Samuel Herzog
我想更新节点的值。但这没有发生。 - ptamzz
我已经更新了我的问题。 - ptamzz
3个回答

37

你没有访问正确的节点。在你的例子中,$xml 保存了根节点 <info/>。这是一个很好的提示:总是将保存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');

如果xName或yName节点不存在,会发生什么? - swl1020
如果您有多个用户具有多个yName,并且想要同时编辑它们,有什么想法吗? - user906379

3
你需要将更改写回文件,使用SimpleXMLElement的asXML方法。

我认为这会重写整个标签。我只想更新特定的节点。 - ptamzz
1
它确实可以,但除非在您自己的代码中编写一半的XML解释逻辑以仅编写特定节点,否则我认为这就是SimpleXML所能达到的极限。 - Ward Muylaert

2

试着这样做。

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

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

这可能不是最好的答案,但对我起了作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接