使用 SimpleXML 从 html 追加到 xml 的问题



我正在尝试使用 PHP 中的 SimpleXML 对现有XML文档进行简单的追加。我有一个HTML表单,它调用一个PHP脚本,该脚本尝试将数据附加到同一目录中已经存在的XML文档中。

我已经尝试了它的基本实现,但我不断收到以下错误:

Warning: SimpleXMLElement::addChild(): Cannot add child. Parent is 
not a permanent member of the XML tree in 
/the/directory/to/the/site/generate.php on line 
9
Fatal error: Uncaught Error: Call to a member function addChild() on 
null...

以下是正在使用的现有XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<tasks>
  <users/>
  <taskList>
    <tasks id="1234">
      <activities>
        <activity/>
      </activities>
    </task>
  </taskList>
</tasks>

这是PHP代码:

<?php
$file = 'tasks.xml';
$xml = simplexml_load_file($file);
$activities = $xml->activities;
$activity = $activities->addChild('activity');
$activity->setAttribute('id', '45678');
$activity->addChild('assigned', 'Jon');
$activity->addChild('priority', 'low');
$xml->asXML($file);

我正在硬编码值只是为了让追加工作,但最终这些值将来自提交的html表单。

关于为什么这失败的任何想法?

你的代码有几个问题。 首先,您的XML无效,您的关闭标记应该</tasks>

当您尝试获取<activities>标记时

$activities = $xml->activities;

这是试图在文档的根目录附近找到标签,您可以使用完整路径

$activities = $xml->taskList->tasks->activities;

或使用(我在此代码中有(XPath 来查找它,这也允许您根据 id 挑选(如有必要(您使用的<tasks>标签。

$activities = $xml->xpath("//activities")[0];
$activity = $activities->addChild('activity');
$activity->addAttribute('id', '45678');
$activity->addChild('assigned', 'Jon');
$activity->addChild('priority', 'low');

您还使用不存在的setAttribute() - 正如代码所示,它是addAttribute()的。

最新更新