我正在尝试使用 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()
的。