创建XML文件以存储权限并使用PHP解析它以创建列表

时间:2016-06-30 11:04:34

标签: php xml xpath

我尝试创建一个xml文件来存储某个角色和区域内的用户应该能够看到的项目列表,然后用PHP解析它以检索此列表。

因此,如果用户从某个$区域登录,则首先检查该区域,如果该区域不在xml内,则忽略该区域。

用户一次只能在一个$区域内,所以如果当前的$ area匹配我,那么需要检查他们当前的$ role是否匹配,用户可以有多个角色。

然后应该为用户可以看到的项目构建一个列表,只包含唯一的项目。

XML结构如下所示:

<?xml version="1.0"?>
<permissions>
    <area name="accounts">
        <role name="user">
            <item>item1</item>
            <item>item2</item>
        </role>
        <role name="manager">
            <item>item1</item>
        </role>
   </area>
   <area name="records">
        <role name="user">
            <item>item1</item>
            <item>item2</item>
        </role>
    </area>
</permissions>

我已经开始使用xpath来获取匹配区域:

    $matchingAreas = $xml->xpath('/permissions/area[@name="' . $area . '"]');

然后,如果$ matchingAreas是&gt; 0我真的不知道如何继续,我的想法是使用匹配角色列表的xpath项来构建对象:

foreach($roles as $role){
            $roleNodes += $matchingAreas->xpath('/permissions/area/role[@name="' . $role . '"]');
        }

我是PHP的新手,这开始显得凌乱/低效,所以我希望有人可以告诉我携带这样的东西的最佳方式?

由于

1 个答案:

答案 0 :(得分:2)

您可以使用单个XPath轻松完成此操作:

$area = "records";
$role = "user";
$itemQuery = sprintf(
    '/permissions/area[@name="%s"]/role[@name="%s"]/item', 
    $area, 
    $role
);

$permissions = simplexml_load_string($string);
foreach ($permissions->xpath($itemQuery) as $item) {
    echo $item->asXML(), PHP_EOL;
}

将输出

<item>item1</item>
<item>item2</item>

如果用户可以拥有多个角色,则可以执行

$area = "accounts";
$role = "manager user";
$itemQuery = sprintf(
    '/permissions/area[@name="%s"]/role[contains("%s", @name)]/item',
    $area, 
    $role
);

$permissions = simplexml_load_string($string);
foreach (array_unique($permissions->xpath($itemQuery)) as $item) {
    echo $item->asXML(), PHP_EOL;
}

由于调用array_unique,输出将与第一个示例相同。