XMLParser返回“NULL值”

时间:2012-08-01 07:56:50

标签: iphone parsing ios5 nsxmlparser nsxml

我尝试解析的服务在这里: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访问。

2 个答案:

答案 0 :(得分: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);

    }

}

答案 1 :(得分:0)

根据docs

  

解析器对象可以发送几个委托   parser:foundCharacters:报告一个字符的消息   元件。因为字符串可能只是整个字符的一部分   当前元素的内容,您应该将其附加到当前元素   字符的积累直到元素改变。

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

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

else parsedata = NULL;

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