2012-11-23 38 views
2

我試圖循環一些XML並執行一個操作,如果屬性值確實或不匹配它在前一次循環迭代時的值。如果語句中匹配的XML屬性在PHP中不匹配

傳入數據已按類別排序。

下面是一些示例XML和代碼

<character_list> 
    <character id="00001"> 
     <name first="Name1"/> 
     <type class="Class A" classid="1"/> 
    </character> 
    <character id="00002"> 
     <name first="Name2"/> 
     <type class="Class A" classid="1"/> 
    </character> 
    <character id="00003"> 
     <name first="Name3"/> 
     <type class="Class B" classid="2"/> 
    </character> 
    <character id="00004"> 
     <name first="Name4"/> 
     <type class="Class B" classid="2"/> 
    </character> 
    <character id="00005"> 
     <name first="Name5"/> 
     <type class="Class B" classid="2"/> 
    </character> 
    <character id="00006"> 
     <name first="Name6"/> 
     <type class="Class C" classid="3"/> 
    </character> 
    <character id="00007"> 
     <name first="Name7"/> 
     <type class="Class D" classid="4"/> 
    </character> 
    <character id="00008"> 
     <name first="Name8"/> 
     <type class="Class D" classid="4"/> 
    </character> 
</character_list> 

這是我的代碼從代碼

Class A - Name1 
Class A - Name2 
Class B - Name3 
Class B - Name4 
Class B - Name5 
Class C - Name6 
Class D - Name7 
Class D - Name8 

預期輸出

<?php 
$query = "data.xml"; 
$xml = file_get_contents($query); 

try { 
     $dataobj = NEW SimpleXMLElement($xml); 
} 

catch(Exception $e) { 
     echo "Parsing error! ".$e->getMessage()." in ".basename($e->getFile()).":".$e->getLine()."!"; 
     exit; 
} 

$lastclass = 0; 

foreach ($dataobj as $xmldata) { 

     $currentclass = $xmldata->type['classid']; 

     if ($lastclass == $currentclass) { 
       echo $xmldata->name['first']." "; 
     } 
     else 
     { 
       echo "<br>"; 
       echo $xmldata->type['class']." - "; 
       echo $xmldata->name['first']." "; 
     } 

     $lastclass = $xmldata->type['classid']; 
} 


?> 

輸出

Class A - Name1 Name2 
Class B - Name3 Name4 Name5 
Class C - Name6 
Class D - Name7 Name8 

任何人都可以看到我做錯了什麼,以及如何糾正它?

回答

0

只投值的字符串這樣的:

foreach ($dataobj as $xmldata) { 

    $currentclass = (string) $xmldata->type['classid']; 

    if ($lastclass == $currentclass) { 
      echo $xmldata->name['first']." "; 
    } 
    else 
    { 
      echo "<br>"; 
      echo $xmldata->type['class']." - "; 
      echo $xmldata->name['first']." "; 
    } 

    $lastclass = (string) $xmldata->type['classid']; 
} 

沒有鑄造你是比較simplexml的對象。

+0

謝謝,這很好 – Epaphus

0

假設傳入的數據沒有排序,因爲您不應該依賴xml中的物理順序,那麼在您處理的時候不要直接打印,而應該存儲在散列或數組中。然後稍後按組要求將它們打印出來。

+0

啊,是的,我應該補充說,傳入的數據已經排序 – Epaphus

+0

這在處理xml的語義上是錯誤的,並且會成爲錯誤和問題的來源。如果你想以特定的順序讀取xml記錄,可能應該引入一個屬性。否則,你是「黑客」的XML。 – chris