首页 > 解决方案 > 使用 SimpleXML 从 html 附加到 xml 的问题

问题描述

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

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

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表单。

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

标签: phphtmlxml

解决方案


您的代码有几个问题。首先,您的 XML 无效,您的结束标记应该是</tasks>.

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

$activities = $xml->activities;

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

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

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

$activities = $xml->xpath("//activities")[0];

$activity = $activities->addChild('activity');
$activity->addAttribute('id', '45678');
$activity->addChild('assigned', 'Jon');
$activity->addChild('priority', 'low');

您还使用setAttribute()which doesn't exist - 如代码所示addAttribute()


推荐阅读