2009-12-20 46 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