我刚刚做了一个关于 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];
(List 是 Data 对象)但是它做了我不明白的第一件事
thelist.drinkID = [[attributeDict objectForKey:@"id"]integerValue];
因为它在 if 语句中,所以不会在每次找到 id 属性时都被覆盖。还是“theList”声明创建了多个对象?
在找到的字符中,我真的不知道发生了什么。据我所知,foundCharaters 字符串是元素内的每一位文本。所以当前元素值实际上只是一束附加在一起的字符串(但我不能说因为某种原因我不能 NSLOG 它)。
从 didEndElement 部分开始,我想知道这是否是对代码的正确解释。
if ([elementName isEqualToString:@"Price"]) {
[app.listArray addObject:thelist];
thelist = nil;
}
我知道,每次解析器命中元素 Price 时,app.list 数组对象(在另一个类中声明)都会将对象添加到它的“thelist”中。
但是这里有点我在早期方法中缺乏理解的地方生效
else {
[thelist setValue:currentElementValue forKey:elementName];
currentElementValue = nil;
}
他们在这里做什么?据我所知,当前元素值只是 XML 文件中的一堆字符。它是如何组织的?使用元素名称?
还有一个问题(对不起,长度)为什么元素名称不区分大小写,我正在试验,我发现它不是。两种语言都区分大小写。