0

解析しようとしているサービスは次のとおりです:http://maps.googleapis.com/maps/api/geocode/xml?address = 1600 + Amphitheatre + Parkway、+ Mountain + View、+ CA&sensor = false

単純なxmlを解析しようとしています。xmlの構造は次のようになります。

<GeocodeResponse>
 <status>OK</status>
 <result>
  <type>street_address</type>
............
............

私の解析コードは次のとおりです。

-(void)parserDidStartDocument:(NSXMLParser *)parser{
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"Element Name is =%@, \nNamespaceURI is =%@, \nQualifiedName is =%@, \n, Attributes     Dictionary is = %@",elementName,namespaceURI,qName,attributeDict);
     currentEltValue = elementName;
    if([elementName isEqualToString:@"status"]){
        parsedata = [[NSString alloc ]init];
        NSLog(@"Initializing the variable here");
    }

}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{

    if([currentEltValue isEqualToString:@"status"]){

        NSLog(@"Inside if loop");
        parsedata = string;
        NSLog(@"Found Characters value is = %@",parsedata);

    }
    else parsedata = NULL;
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString      *)namespaceURI qualifiedName:(NSString *)qName
{
    if([elementName isEqualToString:@"status"]){
        NSLog(@"PARSED DATA: = %@",parsedata);
    }

}
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"Did end document \t parseData Valus is =%@",parsedata);

 }

プログラムを実行すると、コンソールで次のようになります。

2012-08-01 13:21:10.721 XML_Parsing[5624:207] Element Name is =status, 
NamespaceURI is =(null), 
QualifiedName is =(null), 
, Attributes Dictionary is = {
}
2012-08-01 13:21:10.722 XML_Parsing[5624:207] Initializing the variable here
2012-08-01 13:21:10.722 XML_Parsing[5624:207] Inside if loop
2012-08-01 13:21:10.723 XML_Parsing[5624:207] Found Characters value is = OK
2012-08-01 13:21:10.723 XML_Parsing[5624:207] PARSED DATA: = OK
2012-08-01 13:21:10.724 XML_Parsing[5624:207] Inside if loop
2012-08-01 13:21:10.724 XML_Parsing[5624:207] Found Characters value is = 
2012-08-01 13:21:10.803 XML_Parsing[5624:207] Did end document   parseData Valus is =(null)

if条件が2回実行されている理由がわかりません。

更新 *解決策*これは私の問題を解決しました:

1] DidEndElementで:currentEltValue =@""を宣言します。

2]parsedataのすべてのインスタンスにself.parsedataとしてアクセスします。

4

2 に答える 2

2

デリゲート メソッドを次のように置き換えます。タグの終了時に currentEltValue を空の文字列に設定する必要があります。

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString      *)namespaceURI qualifiedName:(NSString *)qName
{
    if([elementName isEqualToString:@"status"]){
        NSLog(@"PARSED DATA: = %@",parsedata);
        currentEltValue=@"";
    }

}

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

    if([currentEltValue isEqualToString:@"status"]){

        NSLog(@"Inside if loop");
        parsedata = string;
        NSLog(@"Found Characters value is = %@",parsedata);

    }

}
于 2012-08-01T10:44:44.330 に答える
0

ドキュメントによると、

パーサー オブジェクトは、いくつかの parser:foundCharacters: メッセージをデリゲートに送信して、要素の文字を報告する場合があります。string は現在の要素の文字コンテンツ全体の一部にすぎない可能性があるため、要素が変更されるまで、現在の文字の蓄積に追加する必要があります。

したがって、if条件が複数回実行される理由を説明できます。おそらく、2 番目の文字列は単に空です。各文字列の長さを出力してみてください。たぶん、別のstatus要素が呼び出されています。

なぜparseDataNULL なのかというと、else の部分で起こっています。

else parsedata = NULL;

parser:foundCharacters:他の要素に対しても呼び出されることに注意してください。したがって、パーサーが終了すると、それらの要素parseDataが検出され、null が割り当てられます。

于 2012-08-01T09:17:30.860 に答える