不能将子元素添加到XML元素中

时间:2015-09-16 12:39:07

标签: php xml

我正在为我正在制作的应用程序构建一些服务器端功能。

我有一段代码让我烦恼。

应该向XML文档中的元素的子元素添加一些子元素。相反,它用新信息替换整个文件,我无法弄清楚原因。

PHP:

super.init(style: .Plain, className: myClassName)

XML文件应该如下所示(这是来自function addRole($pid, $id, $name){ echo $pid; $xml = self::getXml(); foreach($xml->children() as $project){ if($project->id == $pid){ echo self::toJSON($project->roles); $roles = $project->roles->children(); echo self::toJSON($roles); $role = $roles->addchild("role"); $role->addChild("id", $id); $role->addChild("name", $name); echo self::toJSON($role); $role->asXml("../data/projects.xml"); } } } 的实际XML的示例):

projects.xml

我做错了什么?

如果有人想看一下,getXML()是这样的:

<projects>
    <project>
        <id>adultScotland</id>
        <name>Adults(Scotland)</name>
        <roles>
            <role>
                <id>projectM</id>
                <name>Project Manager</name>
            </role>
        </roles>
       <courses>
           <course>Administration of Medication</course>
           <course>Infection Control</course>
           <course>Introducing Positive Approaches to Behaviour</course>
       </courses>
    </project>
</projects>

2 个答案:

答案 0 :(得分:0)

我有一个问题的解决方案。你应该用我的例子改变你的foreach循环。我删除了实验所不需要的所有内容。

foreach($xml->children() as $project){
    if($project->id == $pid){
        $roles = $project->roles;
        $role = $roles->addchild("role");
        $role->addChild("id", $id);
        $role->addChild("name", $name);
    }
}
$xml->asXML('your_xml_doc_name.xml');

问题在于您的代码:$roles = $project->roles->children();。有了它,您自己访问了角色,但您必须访问角色的子级。在simplexml中,它可以像$roles = $project->roles;一样完成。 基本的simplexml使用文档http://php.net/manual/ru/simplexml.examples-basic.php

下一个问题是在asXML函数中。您需要保存整个文档,而不仅仅是新角色。因此,而不是$role->asXml("../data/projects.xml");' in foreach loop, you should print after $ xml-&gt; asXML(&#39; your_xml_doc_name.xml&#39;);`。 asXML函数文档http://php.net/manual/ru/simplexmlelement.asxml.php

答案 1 :(得分:0)

您可以在一行代码中按<roles> foreach()访问xpath()节点:

$roles = $xml->xpath("/projects/project[id = 'dummy']/roles")[0];

以上陈述将......

  • 选择将<project>作为<id>的所有dummy(希望这只是1个节点)
  • 将其<roles>节点(包括所有子节点)作为SimpleXML element
  • 返回
  • 存储在数组$roles
  • by [0]我们仅引用该数组中的第一个元素(需要PHP&gt; = 5.4)

$xml当然是一个SimpleXML对象。

然后,您可以按上述方式添加新的<role>

$newrole = $roles->addchild("role");
// etc.

在行动中看到它:https://eval.in/434484