使用SimpleXML从HTML附加到xml的问题

时间:2019-06-11 17:23:51

标签: php html xml

我正在尝试使用XML中的SimpleXML对现有PHP文档进行简单的追加。我有一个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表单。

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

1 个答案:

答案 0 :(得分:1)

您的代码有两个问题。首先,您的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()