我使用PHP和SimpleXML。
有点难以解释,但我想知道如何做到以下几点。
如果第一个父节点存在且我不存在,请使用以下代码进行检查,我创建该节点。
if (!isset($xml->$serialize)){
$set = $xml->addChild($serialize);
}
$last = $set;
这同样适用于那样检查的其他节点:
if (!isset($last->$serialize)){
$set = $last->addChild($serialize);
}
$last = $set;
如果还没有创建整个路径,那么它的工作原理非常好但是如果已经创建了一些节点,那么它就会出错并创建一个奇怪的路径。我知道为什么会这样做,但我不知道应该如何解决它。
变量$ set从创建子节点获取其值,如果已经创建了一个子节点,那么代码在"如果"没有运行,$ set也没有获得价值。我怎么能这样做,即使已经有一个子节点,变量$ set也会得到它的值?或者我怎样才能复制"你从addchild函数得到的值?
编辑: 我使用以下代码调用xml:
$xml = new SimpleXMLElement("<permissions></permissions>");
并在应用程序结束时保存:
$xml->saveXML("/home/atakan/PhpstormProjects/User_Permissions/test.xml");
我期望的输出看起来像这样。我有四个变量,例如:
然后Xml-Output应该像这个picture。
答案 0 :(得分:0)
您需要将字符串分解为单个组件,然后逐个添加它们。代码主要在那里,但试图一次性添加它不会起作用。
我已将其编写为函数,您可以看到它如何按explode
和/来分割输入。然后它会检查每个级别,因为它会添加任何缺少的元素,或者它们是否存在 - 只需调整$set
以指向结构中的新现有元素。
<?php
error_reporting ( E_ALL );
ini_set ( 'display_errors', 1 );
function addElement ( SimpleXMLElement $start, string $path ) {
$parts = explode("/", $path);
$set = $start;
foreach ( $parts as $part ) {
if ( !isset($set->$part) ) {
$set = $set->addChild($part);
}
else {
$set = $set->$part;
}
}
}
$xml = new SimpleXMLElement("<permissions></permissions>");
addElement( $xml, "a/b/c/d" );
addElement( $xml, "a/b/c/e" );
addElement( $xml, "a/b/f" );
addElement( $xml, "g/h" );
echo $xml->saveXML();
回声......
<?xml version="1.0"?>
<permissions>
<a>
<b>
<c>
<d />
<e />
</c>
<f />
</b>
</a>
<g>
<h />
</g>
</permissions>