php simplexml分组对象 [英] php simplexml grouping objects

查看:68
本文介绍了php simplexml分组对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我开始之前,我想说我是在将XML读入PHP中的一个小白菜,但是我迄今已经设法加载XML并将数据显示到PHP页面上。
我的下一个测试是对项目进行分组。



以下是一个XML片段:

 < MailboxDatabases> 
< MailboxDatabase>
< DatabaseName> DB01< / DatabaseName>
<状态>健康状态< /状态>
< MailboxServer> MB08< / MailboxServer>
< ActiveDatabaseCopy> mb07< / ActiveDatabaseCopy>
< ActivationSuspended> False< / ActivationSuspended>
< SinglePageRestore> 0< / SinglePageRestore>
< ContentIndexState>健康< / ContentIndexState>
< Active> false< / Active>
< / MailboxDatabase>
< MailboxDatabase>
< DatabaseName> DB01< / DatabaseName>
<状态>健康状态< /状态>
< MailboxServer> MB07< / MailboxServer>
< ActiveDatabaseCopy> mb07< / ActiveDatabaseCopy>
< ActivationSuspended> False< / ActivationSuspended>
< SinglePageRestore> 0< / SinglePageRestore>
< ContentIndexState>健康< / ContentIndexState>
< Active> true< / Active>
< / MailboxDatabase>
< MailboxDatabases>
< MailboxDatabase>
< DatabaseName> DB02< / DatabaseName>
<状态>健康状态< /状态>
< MailboxServer> MB08< / MailboxServer>
< ActiveDatabaseCopy> mb07< / ActiveDatabaseCopy>
< ActivationSuspended> False< / ActivationSuspended>
< SinglePageRestore> 0< / SinglePageRestore>
< ContentIndexState>健康< / ContentIndexState>
< Active> true< / Active>
< / MailboxDatabase>
< MailboxDatabase>
< DatabaseName> DB02< / DatabaseName>
<状态>健康状态< /状态>
< MailboxServer> MB07< / MailboxServer>
< ActiveDatabaseCopy> mb07< / ActiveDatabaseCopy>
< ActivationSuspended> False< / ActivationSuspended>
< SinglePageRestore> 0< / SinglePageRestore>
< ContentIndexState>健康< / ContentIndexState>
< Active> false< / Active>
< / MailboxDatabase>
< / MailboxDatabases>

正如您所看到的,DatabaseName在两个项目中是相同的,但Active不同。
我想要做的是在php中显示上面的xml,就像

DB01 - MB08 - false | DB01 - MB07 - true

DB02 - MB08 - true | DB01 - MB07 - false

使用以下元素
(database) - (Mailboxserver) - (active)| ...



请有人给我一只手,并且请尝试解释代码。

解决方案总体策略:


  1. 创建一个唯一组列表,即< DatabaseName>

  2. 全选< MailboxDatabase> 属于他们的< MailboxServer> < Active>

  3. 进入下一个组,并转到第2步,直到您遍历所有组。

现在是时候了解如何从一个XML,最好用 xpath 来完成。简而言之, xpath 用于XML SQL是用于数据库的。



假设您有一个 SimpleXML object ready:

  $ xml = simplexml_load_string($ x); //假定XML在$ x 

创建唯一组列表



获取数组中的所有< DatabaseName>

  $ groups = $ xml-> xpath(/ MailboxDatabases / MailboxDatabase / DatabaseName); 

$ groups 包含一个 SimpleXML 元素现在,让我们做一些数组魔术来将它们转换为字符串:

  $ groups = array_map(strval,$ groups); 

结果( var_dump ):

  array(4){
[0] =>
string(4)DB01
[1] =>
string(4)DB01
[2] =>
string(4)DB02
[3] =>
string(4)DB02
}

:通过翻转键和值使其成为一个唯一的列表,键必须是唯一的,所以重复被杀死。然后再翻转:

$ $ p $ $ $ $ $ c $ $ = array_flip(array_flip($ groups));

结果:

  array(2){
[1] =>
string(4)DB01
[3] =>
string(4)DB02
}

就是这样。把它写成一行:

$ $ $ $ $ $ $ $ $ $ group = array_flip(array_flip(array_map(strval,$ xml-> xpath( // MailboxDatabase / DatabaseName));

BTW: // xpath 语句的开始部分是通配符

选择节点组 -

再次 xpath ,这次只需选择< MailboxDatabase> ,它们共享相同的< DatabaseName> 注意 [] $ b $ $ $ $ $ $元素= $ xml-> xpath(/ MailboxDatabases / MailboxDatabase [DatabaseName ='$ group ']);

现在迭代 $ groups
$ p $ foreach($ groups as $ group){

echogroup $ group: 。PHP_EOL;
$ elements = $ xml-> xpath(// MailboxDatabase [DatabaseName ='$ group']);

foreach($ elements as $ e)
回声。 $ e->邮箱服务器。 :。 $ e-> Active。 PHP_EOL;

echo PHP_EOL;

结果:

  group DB01:
MB08:false
MB07:true

group DB02:
MB08:true
MB07 :false

查看工作情况: https://eval.in/321935


Before I start I would like to say I am a noob at reading XML into PHP but I have so far managed to load XML and display the data onto a PHP page. My next test is to group items.

Here is an XML snippet:

    <MailboxDatabases>
      <MailboxDatabase>
        <DatabaseName>DB01</DatabaseName>
        <Status>Healthy</Status>
        <MailboxServer>MB08</MailboxServer>
        <ActiveDatabaseCopy>mb07</ActiveDatabaseCopy>
        <ActivationSuspended>False</ActivationSuspended>
        <SinglePageRestore>0</SinglePageRestore>
        <ContentIndexState>Healthy</ContentIndexState>
        <Active>false</Active>
      </MailboxDatabase>
      <MailboxDatabase>
        <DatabaseName>DB01</DatabaseName>
        <Status>Healthy</Status>
        <MailboxServer>MB07</MailboxServer>
        <ActiveDatabaseCopy>mb07</ActiveDatabaseCopy>
        <ActivationSuspended>False</ActivationSuspended>
        <SinglePageRestore>0</SinglePageRestore>
        <ContentIndexState>Healthy</ContentIndexState>
        <Active>true</Active>
      </MailboxDatabase>
    <MailboxDatabases>
      <MailboxDatabase>
        <DatabaseName>DB02</DatabaseName>
        <Status>Healthy</Status>
        <MailboxServer>MB08</MailboxServer>
        <ActiveDatabaseCopy>mb07</ActiveDatabaseCopy>
        <ActivationSuspended>False</ActivationSuspended>
        <SinglePageRestore>0</SinglePageRestore>
        <ContentIndexState>Healthy</ContentIndexState>
        <Active>true</Active>
      </MailboxDatabase>
      <MailboxDatabase>
        <DatabaseName>DB02</DatabaseName>
        <Status>Healthy</Status>
        <MailboxServer>MB07</MailboxServer>
        <ActiveDatabaseCopy>mb07</ActiveDatabaseCopy>
        <ActivationSuspended>False</ActivationSuspended>
        <SinglePageRestore>0</SinglePageRestore>
        <ContentIndexState>Healthy</ContentIndexState>
        <Active>false</Active>
      </MailboxDatabase>
    </MailboxDatabases>

As you can see, "DatabaseName" is the same in two items but "Active" is different. What I want to do is display the above xml in php like

DB01 - MB08 - false | DB01 - MB07 - true

DB02 - MB08 - true | DB01 - MB07 - false

using the following elements (database) - (Mailboxserver) - (active) | ...

Please could someone give me a hand and also please try to explain the code.

解决方案

Overall strategy:

  1. create a list of unique groups, that is <DatabaseName>
  2. select all <MailboxDatabase> that belong to a group and echo their <MailboxServer> and <Active>
  3. proceed to the next group and go to step 2 until you iterated over all groups.

It's time to learn about selecting certain nodes from an XML, and this is best done with xpath. In short, xpath is for XML what SQL is for databases.

Let's say you have a SimpleXML object ready:

$xml = simplexml_load_string($x); // assume XML in $x

create a list of unique groups

Get all <DatabaseName> in an array:

$groups = $xml->xpath("/MailboxDatabases/MailboxDatabase/DatabaseName");

$groups contains an array of SimpleXML elements now, so let's do some array-magic to transform those into strings:

$groups = array_map("strval", $groups);

Result (var_dump):

array(4) {
  [0]=>
  string(4) "DB01"
  [1]=>
  string(4) "DB01"
  [2]=>
  string(4) "DB02"
  [3]=>
  string(4) "DB02"
}

Some more array-magic: make it a unique list by flipping keys and values, keys must be unique, so duplicates are killed. then flip again:

$groups = array_flip(array_flip($groups));

Result:

array(2) {
  [1]=>
  string(4) "DB01"
  [3]=>
  string(4) "DB02"
}

This is it. Write it as one line:

$groups = array_flip(array_flip(array_map("strval", $xml->xpath("//MailboxDatabase/DatabaseName"));

BTW: // at the beginning of that xpath statement is a wildcard

select nodes group-wise

Again xpath, this time with a condition to select only those <MailboxDatabase> that share the same <DatabaseName>. Note the condition in []:

$elements = $xml->xpath("/MailboxDatabases/MailboxDatabase[DatabaseName = '$group']");

Now iterating over $groups:

foreach ($groups as $group) {

    echo "group $group:" . PHP_EOL;
    $elements = $xml->xpath("//MailboxDatabase[DatabaseName = '$group']");

    foreach ($elements as $e)
        echo "  " . $e->MailboxServer . ": " . $e->Active . PHP_EOL;

    echo PHP_EOL;
} 

Result:

group DB01:
  MB08: false
  MB07: true

group DB02:
  MB08: true
  MB07: false

see it working: https://eval.in/321935

这篇关于php simplexml分组对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆