我正在为我正在制作的应用程序构建一些服务器端功能。
我有一段代码让我烦恼。
应该向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>
答案 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
[0]
我们仅引用该数组中的第一个元素(需要PHP&gt; = 5.4) $xml
当然是一个SimpleXML对象。
然后,您可以按上述方式添加新的<role>
:
$newrole = $roles->addchild("role");
// etc.
在行动中看到它:https://eval.in/434484