0

我刚刚做了一个关于 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 文件中的一堆字符。它是如何组织的?使用元素名称?

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

4

1 回答 1

0

如果我正确解释了您的问题,那只是了解运行良好的代码。

在您的 XML 中,您有 4 个子元素Priceid=1: nameBeer和.CiderGuinness

foundCharacters方法将找到这 4 个 xml 标记的字符,即在and 、and之间 写入的字符等。在您的情况下,这是for的字符串,然后是 etc 的字符串。<name></name><Beer></Beer>Rosie O'Gradasname4.50Beer

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

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

因为currentElementValue已经存储成功了,应该是销毁了,所以下次命中的时候检查它的存在foundCharacters就可以了。

清除?

于 2012-06-10T13:43:34.660 回答