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

问题描述:

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

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

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

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

的XML结构如下:

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

这时如果$ matchingAreas> 0我真的不是:

<?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得到匹配区启动确定如何继续,我的想法是使用匹配一系列角色的xpath项目来构建对象:

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

我是PHP新手,开始显得杂乱/效率低下,所以我希望有人能告诉我最佳方式来进行这样的事情?

感谢

你可以用一个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; 
} 

由于t o致电array_unique,输出将与第一个例子相同。

+0

谢谢,如果用户有多个角色,我是否需要额外的循环? – mao

+0

@mao no,你可以在XPath中使用'contains'测试。查看更新。 – Gordon

+0

太棒了,谢谢我还没有遇到过sprintf – mao