我刚刚做了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>
这是我的Parser
-(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;
}
}
我注意到数据对象中的Properties名称与解析器中的名称相同。所以我至少理解这一点。
我感到茫然的是,它为这些属性分配了它们的价值。
所以在开始时用
初始化数据对象 thelist = [[List alloc] init];
(List是Data对象)但是它确实做了我不理解的第一件事
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 :(得分:0)
如果我正确地解释了您的问题,那就是了解正常运行的代码。
在您的XML中,Price
id=1
有4个子元素:name
,Beer
,Cider
和Guinness
。
foundCharacters
方法会在这些4个xml标记中找到 字符,即在 <name>
和</name>
之间写的 ,<Beer>
和</Beer>
等。在您的情况下,这是Rosie O'Gradas
的字符串name
,然后4.50
的字符串Beer
等。
当找到字符时,该方法首先检查容器字符串是否存在,如果不存在则创建一个容器字符串currentElementValue
。如果确实存在,则追加找到的字符。
接下来,逻辑上会发生什么?它会点击didEndElement
方法,第一种情况是标记</name>
。在这种情况下,它会将currentElementValue
中收集的文本分配给密钥@"name"
,并将此键值对放入列表中。该列表的类型为List
,在其他地方定义,但它似乎基本上是NSDictionary
。
由于currentElementValue
已成功存储,因此应将其销毁,因此下次点击foundCharacters
时检查其存在是否有效。
清除?