2009-08-22 8 views
2

iPhoneアプリのNSXMLParserを解明しようとしていますが、どのように動作するのか一般的にわかっていますが、私は必要な値をどのように抽出するのか少し混乱します。NSXMLParserで基本XMLファイルを解析するにはどうすればよいですか?

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

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

は、私は3つの事を実行する必要があります。 ステータスの値を取得します。 最初のレコードからコンテンツの値を取得します。複数の「レコード」要素を提供するという応答が出るかもしれないので、最初のものだけを取得する必要があります。

私は単にそれを行う方法を理解できません。私が見てきたほとんどの例は、このデータを取り込む別のオブジェクトを作成することを伴い、2つの値に必要であることはわかりません。誰も私にどのようにこれらの2つのデータを引っ張って最初のレコードのためだけに教えてもらえますか?

答えて

4

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

Appleは SeismicXML examlpleに使用していますように私は、撮影したアプローチは、次のような方法を使用することです

parser:didStartElement:namespaceURI:qualifiedName:attributes:

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

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

具体的なケースについていくつかご説明します。まず、XMLパーサーは文字列を返すだけなので、statusの文字列を整数(または使用しているデータ型)に変換する必要があります。

第二に、あなただけの私がして、そうであれば、nilcontentOfCurrentXMLPropertyを設定する前に、あなたはすでにrecordタグを見てきたかどうかのフラグBOOLを設定するのだparser:didStartElement:...recordの最初の値を、したいからです。

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"]

  • は私に、タグの文字列データを与える:

...

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

...

あなたは(の終わりに達するには中止、「記録」という名前のタグの最初のスタートを検索他のケースのために同じロジックを適用することができますタグ、「レコード」など)

これを見て、自宅で試してみてください:Make NSXMLParser your friend..また、APIリファレンスNSXMLParser for addi NSXMLParserのデリゲートのための代行メソッドを実装しました。

+0

お互いに感謝します。私はついにそれを働かせました。 – SonnyBurnette

関連する問題