拉xml feed并检测更改/删除php

时间:2012-12-18 10:04:52

标签: php xml feed

我想设置一个xml feed轮询系统,该系统每小时从给定的URL下载一个xml feed并检测该feed是否已更改。如果有,则需要做一些事情。

我怎样才能有效地完成这项工作?我将要提取的Feed将包含数千个项目,并且每个项目中可能包含相当多的数据。

我希望能够检测到任何新数据/项目并将其保存到数据库中 我希望能够检测到任何已修改的数据/项目并相应地更新数据库 我希望能够检测到任何已删除的数据/项目并相应地更新数据库。

项目的顺序对我来说无关紧要,所以如果订单发生变化但没有别的,那么我们可以说这些供稿是相同的。

我见过一些人提到散列物品和整个饲料以与之前下载的物品进行比较。如果有很多项目,这可能需要很长时间..

是否有一种简单的方法可以对上次下载的Feed进行差异处理,然后以新的方式删除所有相同的项目?然后可能会查看剩下的项目并进行比较?

我不确定正确的做法是什么。任何建议都将不胜感激。

我要拉的类似饲料的一个例子是:

<properties>
<property>
<location>
<unit-number>301</unit-number>
<street-address>123 Main St</street-address>
<city-name>San Francisco</city-name>
<zipcode>94123</zipcode>
<county>San Francisco</county>
<state-code>California</state-code>
<street-intersection>Broadway</street-intersection>
<parcel-id>359-02-4158</parcel-id>
<building-name>The Avalon</building-name>
<subdivision></subdivision>
<neighborhood-name>Marina</neighborhood-name>
<neighborhood-description>The Marina is a neighborhood on the Northern part of San
Francisco</neighborhood-description>
<elevation>10</elevation>
<longitude>-70.1200</longitude>
<latitude>30.0000</latitude>
<geocode-type>exact</geocode-type>
<display-address>yes</display-address>
<directions>Take 101 North to Lombard St. Make a left on Lombard and 3rd right
onto Main. 123 is at the end of the block on the right. </directions>
</location>
<details>
<listing-title>A great deal in the Marina</listing-title>
<price>725000</price>
<year-built>1928</year-built>
<num-bedrooms>3</num-bedrooms>
<num-full-bathrooms>2</num-full-bathrooms>
<num-half-bathrooms>1</num-half-bathrooms>
<num-bathrooms></num-bathrooms>
<lot-size>0.25</lot-size>
<living-area-square-feet>1720</living-area-square-feet>
<date-listed>2010-06-20</date-listed>
<date-available></date-available>
<date-sold></date-sold>
<sale-price></sale-price>
<property-type>condo</property-type>
<description>Newly remodeled condo in great location.</description>
<mlsId>582649</mlsId>
<mlsName>SFAR</mlsName>
<provider-listingid>258136842</provider-listingid>
</details>
<landing-page>
<lp-url>http://www.BrokerRealty.com/listing?id=123456&amp;source=Trulia</lp-url>
</landing-page>
<listing-type>resale</listing-type>
<status>for sale</status>
<foreclosure-status></foreclosure-status>
<site>
<site-url>http://www.BrokerRealty.com</site-url>
<site-name>Broker Realty</site-name>
</site>

等。

1 个答案:

答案 0 :(得分:2)

  

是否有一种简单的方法可以对上次下载的Feed进行差异处理,然后以新的方式删除所有相同的项目?

当然,事实上它应该很容易。看起来这些都是房地产列表,对吧?如果是这样,MLS提供商的名称和他们为列表发出的标识符形成一个唯一的密钥:

<details>
    <!-- ... -->
    <mlsId>582649</mlsId>
    <mlsName>SFAR</mlsName>
    <provider-listingid>258136842</provider-listingid>
</details>

既然您可以唯一地标识每个列表,那么决定如何检测更改应该是非常简单的。我个人将XML分解成一个多维关联数组,按键名对每个级别进行排序,然后将其序列化并通过哈希例程(例如,md5)运行它,因为这样很有吸引力的草率但是它的工作原理影响。事实上,你已经有了这个想法,有点:

  

我见过一些人提到散列物品和整个饲料以与之前下载的物品进行比较。如果有很多项目,这可能需要很长时间..

通过散列文档中的每个唯一条目,您可以避免在单个条目更改时重新导入整个事物。将每个条目哈希与数据库中的其余数据一起保留,并使用组成唯一键的信息。当哈希值发生变化时,XML已经改变,值得重新导入。

再一次,一旦你拥有了这个独特的密钥,检测新的列表就会非常容易。数据库中没有匹配的密钥?导入。

同样,检测已删除的商家信息非常容易。密钥在数据库中但不在XML中?也许它应该被打破。