我正在尝试解析一个简单的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访问。
答案 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。