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文件的混乱字符。它是如何组织的?元素名称?
还有一个问题(抱歉的长度)为什么不是元素名称区分大小写,我正在试验,我发现它不是。这两种语言都区分大小写。
如果我正确解释你的问题,它只是了解正在工作的代码。
在你的XML你有4个元素Price
与id=1
:name
,Beer
,Cider
和Guinness
。
foundCharacters
方法将在内找到这些4 xml标签,即什么是<name>
和</name>
,<Beer>
和</Beer>
等之间的书面在你的情况下,这name
字符串Rosie O'Gradas
,然后Beer
等
字符时发现,该方法首先,如果检查字符串4.50
容器字符串存在,如果不存在,则创建一个为currentElementValue
。如果它确实存在,它追加找到的字符。
接下来会发生什么,逻辑?它会碰到didEndElement
方法,在第一种情况下,标签</name>
。在这种情况下,它会将currentElementValue
中收集的文本分配给密钥@"name"
,并将此键值对放入列表中。该列表的类型为List
,其定义在其他地方,但它似乎本质上是NSDictionary
。
由于currentElementValue
已成功存储,因此应该销毁,因此下次检查其存在时是否存在foundCharacters
将起作用。
清除?
面向对象编程的目的是为了隐藏你的对象所做的事情,如果你有第三方对象,那么我们只是使用它们:)从不怀疑它大声笑...唯一的原因不要质疑,因为每个人都会有不同的已经在NSXMLParser中完成的实现思路。 – doNotCheckMyBlog
我想我需要知道这里发生了什么。特别是currentElementValue部分 – Brockman