リモート サーバー (場所ごとのビジネス) からデータを読み込み、地図上に表示する必要があるアプリケーションがあります。サーバーからのフィードは XML ベースです。私はこれの実装に成功しましたが、私の人生を少し楽にすることができるかどうか疑問に思いました.
現在、私は Google の GDataXML ライブラリを使用しています。バックグラウンドでリモート データを取得するためのライブラリを実装しており、必要に応じて完了時または読み込み中にコールバックされます。
完全なデータがロードされたら、ドキュメントをトラバースし、さまざまなレベルをオブジェクトに変換し、そのオブジェクトを NSMutableArray に追加して (遅延ロードを行いたいので、さらに要求があれば追加したい)、それを渡します。配列をアプリの次のビットに渡し、マップを解釈してピン留め/注釈を付けます。
XML データの例 (抽象化):
<businesses>
<business>
<name> Fred Bloggs and Co </name>
<address> 123 No Street, Nowhere </address>
<town> Somesville </town>
<county> Someshire </county>
<postcode> XX11 1XX </postcode>
</business>
..... more records but you get the idea .....
</businesses>
ストレージ オブジェクトの例 (抽象化)
-- businessrecord.h --
@interface BusinessRecord : NSObject {
NSString *name;
NSString *address;
NSString *town;
NSString *county;
NSString *postcode;
}
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *address;
@property (nonatomic, copy) NSString *town;
@property (nonatomic, copy) NSString *county;
@property (nonatomic, copy) NSString *postcode;
@end
-- businessrecord.m --
@implementation BusinessRecord
@synthesize name, address, town, county, postcode;
@end
そうです、おそらく、各ノードの各 XML 要素を手動で解析し、手動で BusinessRecord オブジェクトに転送していると推測できます。
プロパティごとに異なる場所に 3 行以上のコードを記述する必要があるため、これは特に時間がかかります。
GDataXML では、次のような方法で各要素にアクセスします。
NSArray *businesses = [[[xmlRoot elementsForName:@"businesses"] objectAtIndex:0] elementsForName:@"business"];
NSMutableArray *businessList = [[NSMutableArray alloc] initWithCapacity: businesses.count];
for (int i=0; i<businesses.count; i++) {
GDataXMLElement *business = [businesses objectAtIndex: i];
BusinessRecord *busRec = [[BusinessRecord alloc] init];
busRec.name = [[[bus elementsForName:@"name"] objectAtIndex:0] stringValue];
.... etc for each element ...
[businessList addObject: busRec];
[busRec release];
}
これはすべて私には非常に長い道のりのように思えます。これを行うためのより良い方法があるに違いありませんか?
私が最終的にやりたいのは、ある種のランダムアクセス配列の「ビジネス」レベルの XML のすべてです。各要素を個別に指定したくありません。
理想的には、次のような連想配列を含むシーケンシャル配列を持つことができる PHP のようなものです。
$businessList = Array(
Array(
"name" => "Fred Bloggs and Co",
"address" => "123 No Street",
"town" => "Sometown",
"county" => "Someshire",
"postcode" => "XX11 1XX"
)
);
したがって、特定の要素を解釈し、そのすべてのサブ要素を正しく取得できるラッパー クラスを作成する必要があると思います (つまり、要素を列挙してから処理します)。
これは何に保存しますか?NSDictionary?
たぶん(疑似コード)のようなもの:
NSArray *businesses = [[[xmlRoot elementsForName:@"businesses"] objectAtIndex:0] elementsForName:@"business"];
NSMutableArray *businessList = [[NSMutableArray alloc] init];
[xmlBreakerUpper breakUpXMLAtElement: businesses addToMutableArray: &businessList];
GDataXML の経験があり、まばらなドキュメントに従うことができないため、列挙を手伝ってくれる人がいます。
私はこの段階で GDataXML に完全に執着しているわけではありません。それを頼りにするクラスは 2 つしかないので、もっと良い方法があれば。
私はサーバー出力を制御していますが、クライアントは、後で実装するかどうかに関係なく、他のデータ アクセス API に対して XML を優先しています。
この段階で XML をサーバーに送り返す必要はありません。現時点ではリクエストは HTTP GET ベースですが、後でフォームに入力すると POST になる可能性があります。
すべての助けや正しい方向へのプッシュは大いに受けました。