php simplexml分组对象 [英] php simplexml grouping objects
问题描述
在我开始之前,我想说我是在将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)| ...
请有人给我一只手,并且请尝试解释代码。
- 创建一个唯一组列表,即
< DatabaseName>
- 全选
< MailboxDatabase>
属于他们的< MailboxServer>
和< Active>
- 进入下一个组,并转到第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 ']);
现在迭代 结果: 查看工作情况: 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: 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: It's time to learn about selecting certain nodes from an XML, and this is best done with Let's say you have a create a list of unique groups Get all Result ( 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: Result: This is it. Write it as one line: BTW: select nodes group-wise Again Now iterating over Result: see it working: https://eval.in/321935 这篇关于php simplexml分组对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋! $ groups $ c $
$ 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
<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>
<DatabaseName>
<MailboxDatabase>
that belong to a group and echo their <MailboxServer>
and <Active>
xpath
. In short, xpath
is for XML what SQL is for databases.SimpleXML
object ready:$xml = simplexml_load_string($x); // assume XML in $x
<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);
var_dump
):array(4) {
[0]=>
string(4) "DB01"
[1]=>
string(4) "DB01"
[2]=>
string(4) "DB02"
[3]=>
string(4) "DB02"
}
$groups = array_flip(array_flip($groups));
array(2) {
[1]=>
string(4) "DB01"
[3]=>
string(4) "DB02"
}
$groups = array_flip(array_flip(array_map("strval", $xml->xpath("//MailboxDatabase/DatabaseName"));
//
at the beginning of that xpath
statement is a wildcard 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']");
$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;
}
group DB01:
MB08: false
MB07: true
group DB02:
MB08: true
MB07: false