2015-04-30 40 views
0

在我開始之前,我想說我是一名讀取XML到PHP的noob,但我迄今爲止設法加載XML並將數據顯示到PHP頁面上。 我的下一個測試是對項目進行分組。php simplexml分組對象

下面是一個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> 

正如你所看到的,「數據庫名稱」是在兩個項目相同,但「活動」不同。 我想要做的就是在php中顯示上面的xml,如

DB01 - MB08 - false | DB01 - MB07 - true

DB02 - MB08 - true | DB01 - MB07 - false

使用以下元素 (數據庫) - (Mailboxserver) - (active)| ...

請有人可以給我一個手,也請嘗試解釋代碼。

+0

你的XML是無效的,可能是你忘了刪除第22行的。 – michi

回答

0

總體戰略:

  1. 創造獨特的組的列表,這是<DatabaseName>
  2. 選擇屬於一組的所有<MailboxDatabase>和回聲的<MailboxServer><Active>
  3. 進行下一組並轉到第2步,直到您遍歷所有組。

現在該學習從XML中選擇某些節點了,最好用xpath完成。簡而言之,xpath適用於XML SQL是用於數據庫的。

假設你有一個SimpleXML對象準備:

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

創造出獨特的羣體

列表獲取所有<DatabaseName>在數組:

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

$groups包含數組現在我們要編寫SimpleXML個元素,所以我們來做一些array-m AGIC改造的成字符串:

$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,這一次的條件請只選擇那些共享相同<DatabaseName><MailboxDatabase>。注意[]條件:

$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

+0

謝謝你的幫助,此時此刻我有點疲憊,你的解釋會在明天通過。再一次,非常感謝 – jasonrose

+0

** @ michi **非常有魅力,非常感謝! – jasonrose