NSXMLParser如何区分不同的元素?

问题描述:

我刚刚在NSXMLParser上做了一个教程。我完全不知所措的是NSXMLParser如何区分不同的元素。对我来说似乎没有定义。NSXMLParser如何区分不同的元素?

这是我的XML

<?xml version="1.0" encoding="UTF-8"?> 
<Prices> 
<Price id="1"> 
<name>Rosie O'Gradas</name> 
<Beer>4.50</Beer> 
<Cider>4.50</Cider> 
<Guinness>4</Guinness> 
</Price> 
</Prices> 

这是我的解析器

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
if ([elementName isEqualToString:@"Prices"]) { 
    app.listArray = [[NSMutableArray alloc] init]; 
    NSLog(@"The Prices Count"); 
} 
else if ([elementName isEqualToString:@"Price"]) { 
    thelist = [[List alloc] init]; 
    thelist.drinkID = [[attributeDict objectForKey:@"id"]integerValue]; 
} 
} 

-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
if (!currentElementValue) { 
    currentElementValue = [[NSMutableString alloc]initWithString:string]; 

} else { 
    [currentElementValue appendString:string]; 
} 

} 

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
if ([elementName isEqualToString:@"Prices"]) { 
    return; 
} 
if ([elementName isEqualToString:@"Price"]) { 
    [app.listArray addObject:thelist]; 
    thelist = nil; 

} else { 
    [thelist setValue:currentElementValue forKey:elementName]; 
    currentElementValue = nil; 
} 
} 

我也注意到,在属性中的数据对象的名字是一样的解析器。所以我至少明白这一点。

我很茫然,它将这些属性赋值给它。

因此,在开始的时候初始化与

 thelist = [[List alloc] init]; 

数据对象(名单是数据对象),但后来它,我不明白

 thelist.drinkID = [[attributeDict objectForKey:@"id"]integerValue]; 

因为它的第一件事在if语句中,每次找到id属性时都不会被覆盖。或者是'theList'声明创建多个对象?

在发现的字符我真的不知道发生了什么。尽可能多的我可以告诉foundCharaters字符串是元素内部的每一点文本。所以当前的元素值实际上只是附加在一起的一串字符串(但由于某种原因,我无法说出我不能NSLOG它)。

从那里的didEndElement部分,我不知道这是否是代码的正确解释。

if ([elementName isEqualToString:@"Price"]) { 
    [app.listArray addObject:thelist]; 
    thelist = nil; 
    } 

据我所知,每个解析器撞击元件价格该app.list数组对象(在另一个类中声明)时间具有对象添加到它的thelist'。

但这里是位在那里我缺乏在以前方法的理解生效

else { 
    [thelist setValue:currentElementValue forKey:elementName]; 
    currentElementValue = nil; 
} 

他们在这里做什么?从我看到的当前元素值仅仅是来自XML文件的混乱字符。它是如何组织的?元素名称?

还有一个问题(抱歉的长度)为什么不是元素名称区分大小写,我正在试验,我发现它不是。这两种语言都区分大小写。

+0

面向对象编程的目的是为了隐藏你的对象所做的事情,如果你有第三方对象,那么我们只是使用它们:)从不怀疑它大声笑...唯一的原因不要质疑,因为每个人都会有不同的已经在NSXMLParser中完成的实现思路。 – doNotCheckMyBlog

+0

我想我需要知道这里发生了什么。特别是currentElementValue部分 – Brockman

如果我正确解释你的问题,它只是了解正在工作的代码。

在你的XML你有4个元素Priceid=1nameBeerCiderGuinness

foundCharacters方法将在内找到这些4 xml标签,即什么是<name></name><Beer></Beer>等之间的书面在你的情况下,这name字符串Rosie O'Gradas,然后Beer

字符时发现,该方法首先,如果检查字符串4.50容器字符串存在,如果不存在,则创建一个为currentElementValue。如果它确实存在,它追加找到的字符。

接下来会发生什么,逻辑?它会碰到didEndElement方法,在第一种情况下,标签</name>。在这种情况下,它会将currentElementValue中收集的文本分配给密钥@"name",并将此键值对放入列表中。该列表的类型为List,其定义在其他地方,但它似乎本质上是NSDictionary

由于currentElementValue已成功存储,因此应该销毁,因此下次检查其存在时是否存在foundCharacters将起作用。

清除?