2

私は自分のiPhoneアプリ用のNSXMLParserを理解しようとしていますが、それがどのように機能するかは一般的に理解していますが、必要な値を抽出する方法についてはまだ少し混乱しています。

私が解析しているXMLの結果は非常に基本的なものです。それはそのようなものです:

<start>
 <status>300</status>
 <record>
  <title>The Title</title>
  <content>Some content</content>
 </record>
</start>

私は3つのことをする必要があります:ステータスの値を取得します。最初のレコードからコンテンツの値を取得します。複数の「レコード」要素を提供する応答が来る可能性があるため、最初の要素のみを取得する必要があります。

どうすればいいのかわからない。私が見たほとんどすべての例では、このデータを入力するための個別のオブジェクトを作成する必要があり、2つの値に必要であることがわかりません。誰かがこれらの2つのデータを最初のレコードだけに引き出す方法を教えてもらえますか?

4

2 に答える 2

4

NSXMLParserXMLタグに遭遇したときに最初に発生するのは、デリゲートメソッドparser:didStartElement:namespaceURI:qualifiedName:attributes:が呼び出されることです。ここで使用する必要があるのは、おそらくelementName変数だけです。次に、XMLパーサーはタグ内の文字を読み取り、parser:foundCharacters:その内容を呼び出します。最後parser:didEndElement:namespaceURI:qualifiedNameに呼び出されます。

AppleがSeismicXMLの例で使用しているように、私が採用したアプローチは、次のような方法を使用することです。

  1. で、要素名の文字列を既知の値と比較して、それparser:didStartElement:namespaceURI:qualifiedName:attributes:が関心のある文字列であるかどうかを確認します。その場合は、インスタンス変数(NSMutableString;と呼びますcontentOfCurrentXMLProperty)を空の文字列に設定します。それ以外の場合はに設定しnilます。
  2. parser:foundCharacters:、見つかった文字をに追加しますcontentOfCurrentXMLProperty
  3. で、適切な変数が何であれ、parser:didEndElement:namespaceURI:qualifiedNameの値を割り当てます。contentofCurrentXMLProperty

詳細については、SeismicXMLの例を参照してください。

特定のケースについていくつか説明します。まず、XMLパーサーは文字列のみを返すため、の場合は文字列を整数(または使用しているデータ型)に変換する必要がありますstatus

次に、の最初の値のみが必要なので、以前にタグを見たことがあるかどうかを示すフラグを 設定し、見た場合はに設定しrecordます。parser:didStartElement:...BOOLrecordcontentOfCurrentXMLPropertynil

于 2009-08-22T17:22:18.377 に答える
2

NSXMLParserはSAXのようなイベントベースのパーサーであることを念頭に置いて、パーサーをセットアップし、起動して、主要なイベントをリッスンする必要があります。

パーサーを設定します。

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
[parser setDelegate:self];
[parser parse];

これらのメソッドをオーバーライドします。

– parser:didStartElement:namespaceURI:qualifiedName:attributes:
– parser:didEndElement:namespaceURI:qualifiedName:
– parser:foundCharacters:

あなたの関数は基本的に次のように言う必要があります:

  • タグの次の開始点に到達したとき:

-(void)parser: didStartElement:(NSString *) namespaceURI:(NSString *) qualifiedName:(NSString *) attributes:(NSDictionary *)

  • そのタグの名前が「ステータス」の場合:

[elementName isEqualToString:@"status"]

  • タグの文字列データを教えてください:

- (void)parser:(NSXMLParser *) foundCharacters:(NSString *)

...

[<your statusValueHolder as NSMutableString> appendString:<foundCharacters' parameter>]

...

他の場合にも同じロジックを適用できます(「record」という名前のタグの最初の開始を検索し、「record」という名前のタグの終わりに到達すると中止するなど)

これを見て、自宅で試してみてください。NSXMLParserを友達にしましょう。NSXMLParserのデリゲートの追加のデリゲートメソッドについては、NSXMLParserのAPIリファレンスドキュメントも参照してください。

于 2009-08-22T17:22:49.827 に答える