2009-12-20 49 views
0

我正在閱讀XML提要,並希望與舊版本進行比較以檢查更新。在PHP中比較XML而不使用散列

我目前的問題是我似乎無法制作SimpleXML對象的副本,另一個問題是我不確定可以直接比較它們。

這是我的代碼,因爲它代表。我顯然只是測試本地文件,但我打算最終從網絡上加載。

長時間使用睡眠可以嗎?我以爲15分鐘的時間間隔往往足夠達到我的目的。

error_reporting(E_NOTICE); 
$file = 'tmbdata_sm.xml'; 

$xml_old = ""; 
while(true){ 
$xml = simplexml_load_file($file); 

if($xml != $xml_old){ 
    foreach($xml->channel->item as $item){ 
     echo $item->title . "\n"; 
     echo $item->link . "\n"; 
    } 
    $xml_old = clone $xml; 
    $xml = ""; 
}else{ 
    echo 'no change'; 
} 

sleep(60); 
} 

回答

0

我想你不能用這種方式比較簡單的xml對象。

我會嘗試使用任何你感覺舒服的(比如說,cURL extension)下載xml,然後比較xml文本字符串,然後當你發現它們不同時,使用simplexml_load_string()解析xml文本。

+1

甚至只是在URL上使用'file_get_contents()',因爲這相當於'simplexml_load_file()'。否則,我正在給出相同的答案:只是比較它們作爲字符串。 – 2009-12-21 03:26:56

+0

如果最新文檔中xml元素的順序發生變化,該怎麼辦?即使文檔具有相同的語義,文本比較也會顯示文檔不同。 海事組織你需要在進行任何比較之前對下載的版本進行排序。看看http://stackoverflow.com/questions/2788404/sort-xml-nodes-with-php – xvga 2011-12-20 09:03:54

+0

@xvga你沒有很好的理由使事情變得複雜。如果沒有關於詞彙的詳細知識,你不能僅僅假定元素順序對於語義是重要的。此外,即使文檔可能在語義上相同,應用程序仍然可能對更改感興趣。 (想想例如評論的變化) – 2012-01-22 10:24:35

1

沒有關於您的上下文中「更新」含義的定義,恐怕您的問題可能仍未得到答覆。字符串比較可能會起作用,但更好更快的方法是使用filemtime()which lets you know the last time that the file was modified

此外,你應該避免使用sleep()像你一樣在無限循環中。我不認爲讓PHP無限期運行對你的計算機或服務器來說是健康的。執行此操作的正確方法是使用UNIX時的cronjob或使用Windows時的task scheduler

+0

filemtime()將是一個優雅的解決方案,但因爲我想從http讀取xml,我不認爲它會起作用(儘管我會嘗試它)。 你能提供一個解釋或鏈接,說明爲什麼在無限循環中使用睡眠是一件壞事?我並不是不同意你,我只想知道並且找不到任何信息(我的意思是從cmd行運行php,顯然網絡腳本的無限循環不是好事)。我的主機(nfs)目前不允許cron作業,我可以在我的本地機器上看到,php既不使用cpu也不使用ram使用睡眠(5 * 60) – aland 2009-12-24 13:26:01

+0

也許檢出http標頭?我不確定 – droope 2011-03-17 17:21:43