Сравните 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);
}

person aland    schedule 20.12.2009    source источник


Ответы (2)


Я думаю, что вы не можете сравнивать простые объекты xml таким образом.

Я бы попытался загрузить xml, используя то, что вам удобно (скажем, расширение cURL), затем сравните текстовые строки xml, а затем, когда вы обнаружите, что они различаются, используйте simplexml_load_string() для анализа текста xml.

person Roland Bouman    schedule 20.12.2009
comment
Или даже просто используйте file_get_contents() в URL-адресе, так как это эквивалентно simplexml_load_file(). В противном случае я собирался дать тот же ответ: просто сравните их как строки. - person Josh Davis; 21.12.2009
comment
что, если порядок элементов xml в последнем документе изменится? Сравнение текста покажет, что документы разные, даже если они имеют одинаковую семантику. ИМО, вам нужно отсортировать загруженную версию, прежде чем делать какие-либо сравнения. Взгляните на stackoverflow.com/questions/2788404/sort -xml-узлы-с-php - person xvga; 20.12.2011
comment
@xvga ты все усложняешь без веской причины. Без детального знания словарного запаса вы не можете просто предположить, что порядок элементов важен или не важен для семантики. Кроме того, приложение все еще может быть заинтересовано в изменении, даже если документ может быть семантически эквивалентным. (Вспомните, например, изменения в комментариях) - person Roland Bouman; 22.01.2012
comment
@RolandBouman хорошо, это произошло в моей ситуации: порядок не имел значения для семантики - person xvga; 22.01.2012
comment
@xvga Можем ли мы согласиться с тем, что в общем случае и без дальнейшего уточнения требований не очевидно, что элементы следует сортировать, и если да, то как их следует сортировать? - person Roland Bouman; 27.01.2012

Боюсь, что без определения того, что означает «обновлено» в вашем контексте, ваш вопрос может остаться без ответа. Сравнение строк может работать, но лучше и быстрее использовать filemtime() , который позволяет узнать время последнего изменения файла.

Также вам следует воздерживаться от использования sleep() в бесконечном цикле, как вы это делаете. Я не думаю, что работа PHP на неопределенный срок будет полезна для вашего компьютера или вашего сервера. Правильным способом сделать это является либо cronjob при использовании UNIX, либо планировщик задач в Windows.

person tedeh    schedule 23.12.2009
comment
filemtime() было бы элегантным решением, но поскольку я хочу прочитать xml с http, я не думаю, что это сработает (хотя я попробую). Можете ли вы дать объяснение или ссылку, почему использование сна в бесконечном цикле - это плохо? Я не спорю с вами, я просто хотел бы знать и не мог найти никакой информации (и я имею в виду запуск php из строки cmd, очевидно, бесконечный цикл для скрипта в Интернете - это не очень хорошо). Мой хост (nfs) в настоящее время не разрешает задания cron, и я вижу на своей локальной машине, что php не использует ни процессор, ни оперативную память, используя спящий режим (5 * 60) - person aland; 24.12.2009
comment
возможно, проверка заголовков http? Я не уверен - person Pedro; 17.03.2011