PHP - "复制" addchild函数的值

时间:2017-10-03 14:41:27

标签: php xml simplexml

我使用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");

我期望的输出看起来像这样。我有四个变量,例如:

  • A / B / C / d
  • A / B / C / E
  • A / B / F
  • G / H

然后Xml-Output应该像这个picture

1 个答案:

答案 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>