Прежде чем начать, я хотел бы сказать, что я читаю XML в PHP, но до сих пор мне удалось загрузить XML и отобразить данные на странице PHP. Мой следующий тест – это групповые элементы.
Вот фрагмент XML:
<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» одинаково для двух элементов, но «Active» отличается. То, что я хочу сделать, это показать выше xml в php, как
DB01 – MB08 – false | DB01 – MB07 – true
DB02 – MB08 – true | DB01 – MB07 – false
используя следующие элементы (база данных) – (Mailboxserver) – (активный) | …
Пожалуйста, может кто-то дать мне руку, а также попробуйте объяснить код.
Общая стратегия:
<DatabaseName>
<MailboxDatabase>
, принадлежащие группе, и выполните эхо их <MailboxServer>
и <Active>
Пришло время узнать о выборе определенных узлов из XML, и это лучше всего сделать с помощью xpath
. Короче говоря, xpath
предназначен для XML, что SQL для баз данных.
Допустим, у вас есть объект SimpleXML
:
$xml = simplexml_load_string($x); // assume XML in $x
создать список уникальных групп
Получите все <DatabaseName>
в массиве:
$groups = $xml->xpath("/MailboxDatabases/MailboxDatabase/DatabaseName");
$groups
SimpleXML
содержит массив элементов 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" }
Еще несколько массивов: сделайте его уникальным списком, щелкнув клавиши и значения, ключи должны быть уникальными, поэтому дубликаты убиты. затем снова переверните:
$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"));
BTW: //
в начале этого оператора xpath
является подстановочным знаком
выбирать узлы по группам
Снова xpath
, на этот раз с условием для выбора только тех <MailboxDatabase>
которые совместно используют те же <DatabaseName>
. Обратите внимание на условие в []
:
$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
см. его работу: https://eval.in/321935