2011-01-11 10 views
2

私は、リモートサーバーからデータをロードして(場所ごとにビジネス)、マップ上に表示する必要があるアプリケーションを持っています。サーバーからのフィードはXMLベースです。私はこれをうまく実装しましたが、私の人生をもっと楽にすることができるかどうか疑問に思っています。iOS: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]; 
} 

このすべては、非常に長い私にったらしい、これを行うのより良い方法がなければならないようですか?

私が最後にしたいのは、何らかの種類のランダムアクセス配列の "business"レベルの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になる可能性があります。

すべてのヘルプやgreatfully受けた右方向に押し込みます。

答えて

1

オプション1:

あなたは GDataXMLElement引数を受け入れることをご businessrecordクラス用に独自のinitメソッドを作成し、もう少し快適目にしているいくつかのXPath式を使用して、必要な値を解析でき

;)

オプション2:

連想配列のPHPのような配列を達成するために、次のことができます。「ビジネス」要素の配列を超える 反復、およびなどの子要素名を使用して、各ビジネスエレメントの子を反復処理NSMutableのキーディクショナリのビジネスレコードを作成し、新しく作成したディクショナリを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]; 
} 

あなたが探しているようしかし、彼らは、特定のモデルオブジェクトではなく、より一般的なデータ・オブジェクトに解析している、固体読み込みだったXML解析のためのオプションを研究しながら、私はこの記事「How To Read and Write XML Documents with GDataXML」につまずい。

GDataXMLはやり過ぎのように思えるのようにして、彼らの他の記事「How To Choose The Best XML Parser For Your iPhone Project」をチェックアウトする必要があります。