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 条件运行两次?

更新 *解决方案* 这解决了我的问题:

1] 在 DidEndElement 中:声明 currentEltValue = @""。

2] 以 self.parsedata 的形式访问所有 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: 消息来报告元素的字符。因为字符串可能只是当前元素的全部字符内容的一部分,所以您应该将它附加到当前的字符累积中,直到元素发生变化。

这样就可以解释为什么 if 条件会被多次执行。也许第二个字符串只是空的。尝试打印每个字符串的长度。也许它被称为另一个status元素。

至于为什么parseData是NULL,它发生在else部分。

else parsedata = NULL;

请记住,parser:foundCharacters:其他元素也会被调用。因此,当解析器完成时,它会遇到这些元素并被parseData分配为 null。

于 2012-08-01T09:17:30.860 回答