2012-08-01 117 views
0

我试图解析的服务是这里:http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false返回“空值”的XMLParser

我想解析一个简单的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条件运行两次?

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

1]在DidEndElement:申报currentEltValue = @ “”。

2]将所有parsedata的实例作为self.parsedata进行访问。

回答

0

按照docs

解析器对象可以发送代表几个 解析器:foundCharacters:消息以报告一个 元件的字符。因为字符串可能只是当前元素的总字符内容的一部分,所以您应该将其附加到字符当前的 堆积中,直到元素更改。

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

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

else parsedata = NULL; 

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

+0

我删除了其他部分仍然得到相同的输出。我们可以通过使用XML_Parsing来实现这个功能。XML_Parsing 2012-08-01 15:17:33.951 XML_Parsing Inside if循环 2012-08-01 15:17:33.952 XML_Parsing找到的字符值是= OK 2012-08-01 15:17:33.953 XML_Parsing [8151:207 ] PARSED DATA = OK 2012-08-01 15:17:33.954 XML_Parsing [8151:207] Inside if循环 2012-08-01 15:17:33.954 XML_Parsing [8151:207]找到的字符数值是 2012-08 -01 15:17:33.957 XML_Parsing [8151:207]没有结束文档\t parseData Valus =结果 而链接是, [link] http://maps.googleapis。com/maps/api/geocode/xml?address = 1600 + Amphitheater + Parkway,+ Mountain + View,+ CA&sensor = false – footyapps27 2012-08-01 09:49:29

+0

@ footyapps27 parseData value“result”如何成为标签之一?你在其他地方分配给parseData吗? – MadhavanRP 2012-08-01 09:56:33

+0

以及你可以从程序中看到,没有。这就是我们为什么要采用其中一个标签而感到困惑的原因。 – footyapps27 2012-08-01 10:04:21

2

替换您的委托方法如下,您必须在标记结束时将currentEltValue设置为空字符串。

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

} 

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

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

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

    } 

}