2

リモート サーバー (場所ごとのビジネス) からデータを読み込み、地図上に表示する必要があるアプリケーションがあります。サーバーからのフィードは 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 になる可能性があります。

すべての助けや正しい方向へのプッシュは大いに受けました。

4

1 に答える 1

1

オプション1:

businessrecord引数を受け入れ、GDataXMLElementいくつかの XPath 式を使用して必要な値を解析するクラス用の独自の init メソッドを作成できます。

オプション 2:

連想配列の PHP のような配列を実現するには、次のことができます。 「ビジネス」要素の配列を反復処理し、子要素名を NSMutableDictionary ビジネス レコードのキーとして使用して、各ビジネス要素の子を反復処理し、新しく作成されたbusinessList 配列のディクショナリ。

/* THIS IS JUST A QUICK PSEUDO-CODE-ISH SAMPLE */
NSArray *businesses = [xmlRoot nodesForXPath:@"//businesses/business" error:nil];
NSMutableArray *businessList = [[NSMutableArray alloc] initWithCapacity: businesses.count];

GDataXMLElement *business;

for (business in businesses)
{
    NSMutableDictionary *businessRecord = [[NSMutableDictionary] array];

    // iterate over child elements of "business", use element names as keys for businessRecord
    NSArray *businessChildren = [business children];    
    GDataXMLElement *businessChild;
    for (businessChild in businessChildren)
    {
        [businessRecord setValue:[businessChild value] forKey:[businessChild name]]
    }

    [businessList addObject:businessRecord];
    [businessRecord release];
}

この記事「GDataXML を使用して XML ドキュメントを読み書きする方法」に出くわしましたが、XML 解析のオプションを調べていて、これは確かな読み物でしたが、探しているようなより一般的なデータ オブジェクトではなく、特定のモデル オブジェクトで解析しています。 .

GDataXML はやり過ぎのように思えるので、別の記事「iPhone プロジェクトに最適な XML パーサーを選択する方法」を参照してください。

于 2011-02-01T18:06:16.773 に答える