1

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

我怎样才能有效地做到这一点?我要提取的提要里面有数千个项目,每个项目可能都有相当多的数据。

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

项目的顺序对我来说并不重要,所以如果顺序发生变化但没有其他变化,那么我们可以说提要是相同的。

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

是否有一种简单的方法可以对上次下载的提要和新提要进行比较,然后以某种方式删除所有相同的项目?也许然后检查剩下的项目并进行比较?

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

我将要提取的类似提要的示例是:

<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>

ETC..

4

1 回答 1

2

是否有一种简单的方法可以对上次下载的提要和新提要进行比较,然后以某种方式删除所有相同的项目?

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

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

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

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

通过散列文档中的每个唯一条目,您可以避免在单个条目更改时重新导入整个内容。将每个条目的哈希与数据库中的其余数据以及构成唯一键的信息一起粘贴。当哈希值发生变化时,XML 也发生了变化,值得重新导入。

再说一次,一旦您拥有了唯一的密钥,就可以非常容易地检测到新列表。数据库中没有匹配的键?进口。

同样,检测已删除的列表非常容易。密钥在数据库中但不在 XML 中?也许它应该被核弹。

于 2012-12-18T20:11:39.180 回答