1

1時間ごとに特定のURLからxmlフィードをダウンロードし、フィードが変更されたかどうかを検出する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>

等..

4

1 に答える 1

2

最後にダウンロードしたフィードと新しいフィードを比較して、同じアイテムをすべて削除する簡単な方法はありますか?

確かに、実際にはそれはかなり簡単なはずです。これらは不動産リストのようですよね?その場合、MLSプロバイダーの名前と、MLSプロバイダーがリストに対して発行する識別子は、一意のキーを形成します。

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

各リストを一意に識別できるようになったので、変更を検出する方法を決定するのは非常に簡単です。私は個人的にXMLを多次元の連想配列にマングルし、すべてのレベルをキー名で並べ替えてから、シリアル化してハッシュルーチン(たとえば、md5)で実行します。効果。実際、あなたはすでにその考えを持っていました。

以前にダウンロードしたものと比較するために、アイテムとフィード全体をハッシュすることに言及している人が何人かいます。アイテムが多い場合は、時間がかかる可能性があります。

ドキュメント内の一意の各エントリをハッシュすることで、1つのエントリが変更されたときに全体を再インポートする必要がなくなります。エントリごとのハッシュを、データベース内の残りのデータと、一意のキーを構成する情報に貼り付けます。ハッシュが変更されると、XMLが変更されたため、再インポートする価値があります。

繰り返しになりますが、その一意のキーを取得すると、新しいリストを驚くほど簡単に検出できます。データベースに一致するキーがありませんか?輸入。

同様に、削除されたリストを検出するのは驚くほど簡単です。キーはデータベースにありますが、XMLにはありませんか?多分それは核兵器でなければなりません。

于 2012-12-18T20:11:39.180 に答える