【问题标题】:How can I check the content of the arrays? Parsing XML file with ObjectiveC如何检查数组的内容?使用 Objective C 解析 XML 文件
【发布时间】:2011-02-16 20:38:05
【问题描述】:

我有 3 节课->

video { nameVideo, id, description, user... }  
topic {nameTopic, topicID, NSMutableArray videos; }  
category {nameCategory, categoryID, NSMUtableArray topics}  

然后在我的应用委托中我定义了-> NSMutableArray 类别;

我用这段代码解析一个 XML 文件。我尝试了数组层次结构,我认为我没有在数组上添加任何对象。我怎样才能检查它?怎么了?

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict {

    if([elementName isEqualToString:@"Videos"]) {
        //Initialize the array.
        appDelegate.categories = [[NSMutableArray alloc] init];
    }


    else if ([elementName isEqualToString:@"Category"])
    {
        aCategory = [[Category alloc] init];

        aCategory.categoryID = [[attributeDict objectForKey:@"id"] integerValue];

        NSLog(@"Reading id category value: %i", aCategory.categoryID);

    }

    else if ([elementName isEqualToString:@"Topic"]) {
        aTopic = [[Topic alloc] init];

        aTopic.topicID = [[attributeDict objectForKey:@"id"] integerValue];

        NSLog(@"Reading id topic value: %i", aTopic.topicID);

    }

    else if ([elementName isEqualToString:@"video"]) {

        aVideo = [[Video alloc] init];

        aVideo.videoID = [[attributeDict objectForKey:@"id"] integerValue];
        aVideo.nameTopic = currentNameTopic; 
        aVideo.nameCategory = currentNameCategory; 

        NSLog(@"Reading id video value: %i", aVideo.videoID);

    }


    NSLog(@"Processing Element: %@", elementName);
}



- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    if(!currentElementValue)
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    else
        [currentElementValue appendString:string];

    NSLog(@"Processing Value: %@", currentElementValue);

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if([elementName isEqualToString:@"Videos"]) 
        return; 

    if ([elementName isEqualToString:@"Category"]) {
        [appDelegate.categories addObject:aCategory];
         [aCategory release];
         aCategory = nil;
    }


    if ([elementName isEqualToString:@"Topic"]) {
        [aCategory.topics addObject:aTopic];
        //NSLog(@"contador: %i", [aCategory.topics count]);
        //NSLog(@"contador: %@", aTopic.nameTopic);

        [aTopic release];
        aTopic = nil;
    }        

    if ([elementName isEqualToString:@"video"]) {
        [aTopic.videos addObject:aVideo];
        NSLog(@"count number videos:  %i", [aTopic.videos count]); --> always 0
        NSLog(@"NOM CATEGORIA VIDEO:  %@", aVideo.urlVideo); --> OK

        [aVideo release];
        aVideo = nil;
    }

    if ([elementName isEqualToString:@"nameCategory"]) {
        //[aCategory setValue:currentElementValue forKey:elementName];
        aCategory.nameCategory = currentElementValue; 
        currentNameCategory = currentElementValue; 
    }

    if ([elementName isEqualToString:@"nameTopic"]) {
        aTopic.nameTopic = currentElementValue; 
        currentNameTopic = currentElementValue; 
    }


    else 
    [aVideo setValue:currentElementValue forKey:elementName];

    [currentElementValue release];
    currentElementValue = nil;

}

//xmlparser.h

@class TSCTerrassaAppDelegate, Category, Topic, Video; 
@interface XMLParser : NSObject {

    NSMutableString *currentElementValue; 
    NSMutableString *currentNameCategory;
    NSMutableString *currentNameTopic; 

    TSCTerrassaAppDelegate *appDelegate; 

    Video *aVideo;
    Topic *aTopic; 
    Category *aCategory; 
}

@property (nonatomic, retain)NSMutableString *currentNameCategory; 
@property (nonatomic, retain) NSMutableString *currentNameTopic;

//视频.h

@interface Video : NSObject {

    NSInteger videoID; 
    NSString *nameVideo;
    NSString *nameCategory; 
    NSString *nameTopic; 
    NSString *user;
    NSString *date; 
    NSString *description; 
    NSString *urlThumbnail;
    NSString *urlVideo;
}

//Topic.h

@class Video; 

@interface Topic : NSObject {
    NSMutableString *nameTopic; 
    NSInteger topicID; 
    NSMutableArray *videos; 
}

@property (nonatomic, readwrite) NSInteger topicID;
@property (nonatomic, retain) NSMutableArray *videos; 
@property (nonatomic, retain) NSMutableString *nameTopic; 

//Category.h

@class Topic, Video; 

@interface Category : NSObject {
    NSMutableString *nameCategory; 
    NSInteger categoryID; 
    NSMutableArray *topics; 
}

@property (nonatomic, retain) NSMutableArray *topics;
@property (nonatomic, readwrite) NSInteger categoryID; 
@property (nonatomic, retain) NSMutableString *nameCategory;

//AppDelegate

@class NavegaNavController;

@interface TSCTerrassaAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    IBOutlet UITabBarController *rootController; 
    IBOutlet NavegaNavController *navegaNavController; 

    NSMutableArray *categories; 
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *rootController; 
@property (nonatomic, retain) IBOutlet NavegaNavController *navegaNavController; 

@property (nonatomic, retain) NSMutableArray *categories; 

这里是一个简短的 XML 文件示例:

<Videos>
<Category id="12"> 
<nameCategory>xxxx</nameCategory>
<Topic id="43"> 
<nameTopic>zzzz</nameTopic> 
<video id="54"> 
<nameVideo>videoest1</nameVideo> 
<user>skiria</user> 
<date>24-11-09</date>
<description>testing videos</description> 
<urlThumbnail>URLTHUMBNAIL</urlThumbnail> <urlVideo>http://bipbop/gear1/prog_index.m3u</urlVideo>
</video>
</Topic>
</Category>
</Videos>

【问题讨论】:

    标签: objective-c cocoa-touch nsarray xml-parsing


    【解决方案1】:

    看起来 aTopic.videos 从来没有被分配/初始化过。

    在 didStartElement 中创建 aTopic 后,立即对 aTopic.videos 执行 alloc+init。

    【讨论】:

    • 我添加了这个 aTopic.videos = [[NSMutableArray alloc] init];在 didStartElement 上,但问题是一样的。计数返回 0。这是我添加的地方: else if ([elementName isEqualToString:@"Topic"]) { aTopic = [[Topic alloc] init]; aTopic.videos = [[NSMutableArray alloc] init]; aTopic.topicID = [[attributeDict objectForKey:@"id"] integerValue]; NSLog(@"读取id主题值:%i", aTopic.topicID); }
    • 记录计数的地方,也只记录一个Topic(例如NSLog("aTopic = %@", aTopic);)以确保它不是nil。也许它会在视频元素结束之前发布。
    • 我得到 ... 每个主题元素都有不同的值。这是什么意思?错误可能在哪里?
    • 所以主题不是零。它们是不同的,因为您为每个 Topic 元素创建了一个新的 aTopic。不确定是什么问题。发布一个简短但完整的 xml 示例(将其添加到问题中)。在调试器中单步调试代码也可能对您有所帮助。
    • 又发现一个问题:创建 aCategory 时也没有创建 aCategory.topics。在 didStartElement 中 aCategory 的 alloc+init 之后添加这一行:aCategory.topics = [[NSMutableArray alloc] init];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多