NSXMLParser如何区分不同的元素?

时间:2012-06-10 13:07:17

标签: objective-c 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>

这是我的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文件中的混乱字符。它是如何组织的?使用元素名称?

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

1 个答案:

答案 0 :(得分:0)

如果我正确地解释了您的问题,那就是了解正常运行的代码。

在您的XML中,Price id=1有4个子元素:nameBeerCiderGuinness

foundCharacters方法会在这些4个xml标记中找到 字符,即在 <name></name>之间写的<Beer></Beer>等。在您的情况下,这是Rosie O'Gradas的字符串name,然后4.50的字符串Beer等。

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

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

由于currentElementValue已成功存储,因此应将其销毁,因此下次点击foundCharacters时检查其存在是否有效。

清除?