NSXML解析器读取属性

时间:2011-05-23 12:43:38

标签: iphone objective-c xml nsxmlparser

我有一个重复的元素,我需要读取它的属性并将它们发送给代理

xml是:

<special>
   <day date="22/04/2011" name="Easter Friday">Closed</day>
   <day date="23/04/2011" name="Easter Saturday">10:00-16:00</day>
   <day date="24/04/2011" name="Easter Sunday">Closed</day>
   <day date="25/04/2011" name="Anzac Day">13:00-17:00</day>
   <day date="26/04/2011" name="Easter Tuesday">09:00-18:00</day>
</special>

我只能将日期和名称的最后属性传递给代表,我知道为什么会发生这种情况,但我不知道如何修复它。有人可以帮助我

这是我的目标C代码

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"special"]) {
        storeAppDelegate.openingHoursSpecialDelegate = [[NSMutableArray alloc] init];
    }else if ([elementName isEqualToString:@"day"]) {
        openingHoursView = [[OpeningHoursView alloc] init];
        openingHoursView.name = [attributeDict objectForKey:@"name"];
        openingHoursView.date = [attributeDict valueForKey:@"date"];
      }
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"special"])
        return;
    if ([elementName isEqualToString:@"day"]){
        [storeAppDelegate.openingHoursSpecialDelegate addObject:openingHoursView];
        [openingHoursView release];
        openingHoursView = nil;     

    }   
}

openingHoursSpecialDelegate是app委托中的可变数组,而OpeningHoursView是一个NSObject,在另一个类中有名称和日期作为字符串。它们还获取app委托的值,它也只是XML文件中“date”和“name”属性的最后读取值。 我正在使用NSXML解析器 所以我的问题是如何让“openingHoursView.name”和“openingHoursView.date”将他们获得的每个值写入openingHoursSpecialDelegate,而不是像现在这样覆盖它们

2 个答案:

答案 0 :(得分:1)

我发现代码没有任何问题。我已经将上面的代码放到一个小的测试项目中(稍作修改使它独立运行),它对我来说运行正常。

  

阵列(       “复活节星期五,22/04/2011”,       “复活节星期六,23/04/2011”,       “复活节星期天,24/04/2011”,       “澳新军团日,25/04/2011”,       “复活节星期二,26/04/2011”)

Example project

您需要更改我在类test2AppDelegate中硬编码的路径,以指向包含您在上面发布的XML的文件。

答案 1 :(得分:1)

我已经在我的项目中解决了这个问题。但我使用的是libxml2 问题是(日节点)你必须将5个不同的值设置为相同的键(日),这就是你获得最后一个属性的原因。