开发者

NSXMLParser problem - SeismicXML Sample

Hey, I have to parse XML in my iOS app. I took Apple's SeismicXML Sample as my base, but I'm experiencing a really strange behaviour.

These are my parser methodes:

    - (开发者_如何学运维void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
                                    namespaceURI:(NSString *)namespaceURI
                                   qualifiedName:(NSString *)qName
                                      attributes:(NSDictionary *)attributeDict {

if ([elementName isEqualToString:kEntryElementName]) {
    Photo *photo = [[Photo alloc] init];
    self.currentPhotoObject = photo;
    [photo release];

} else if ([elementName isEqualToString:kTitleElementName] ||
       [elementName isEqualToString:kLocationElementName] ||
       [elementName isEqualToString:kAuthorElementName]) {

    accumulatingParsedCharacterData = YES;

    [currentParsedCharacterData setString:@""];
}

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
                                  namespaceURI:(NSString *)namespaceURI
                                 qualifiedName:(NSString *)qName {     
if ([elementName isEqualToString:kEntryElementName]) {
    NSLog(@"Did End - Titel:%@", self.currentPhotoObject.titleText);
    NSLog(@"Did End - Location:%@", self.currentPhotoObject.locationText);
    NSLog(@"Did End - Author:%@", self.currentPhotoObject.author);

    [self.currentParseBatch addObject:self.currentPhotoObject];

    parsedPhotosCounter++;
    if ([self.currentParseBatch count] >= kMaximumNumberOfPhotosToParse) {
        [self performSelectorOnMainThread:@selector(addPhotosToList:)
                               withObject:self.currentParseBatch
                            waitUntilDone:NO];
        self.currentParseBatch = [NSMutableArray array];
    }
}    

else if ([elementName isEqualToString:kTitleElementName]) {
    self.currentPhotoObject.titleText = self.currentParsedCharacterData;
} 

else if ([elementName isEqualToString:kAuthorElementName]) {
    self.currentPhotoObject.author = self.currentParsedCharacterData;

}

else if ([elementName isEqualToString:kLocationElementName]) {
    self.currentPhotoObject.locationText = self.currentParsedCharacterData;        
} 

accumulatingParsedCharacterData = NO;

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (accumulatingParsedCharacterData) {
    // If the current element is one whose content we care about, append 'string'
    // to the property that holds the content of the current element.
    //
    [self.currentParsedCharacterData appendString:string];
}

}

Everything works great, the XML Data comes correctly. The parser parses everything as it should. The problem is in the parser didEndElement methode.

 else if ([elementName isEqualToString:kTitleElementName]) {
    self.currentPhotoObject.titleText = self.currentParsedCharacterData;
} 

When I get "self.currentPhotoObject.titleText" via NSLog, I get the right parsed Data. But then:

else if ([elementName isEqualToString:kAuthorElementName]) {
    self.currentPhotoObject.author = self.currentParsedCharacterData;

}

When I get the NSLog of "self.currentPhotoObject.titleText" and from "self.currentPhotoObject.author" here, both give me the author. In the third parsed methode it is the same. All three properties (titleText, author and locationText) are the locationText.

I have no idea why .titleText e.g. is changed when the parser sets .author.

I have doublechecked everything at least 10 times and compared it to the SeismicXML sample but I can't find the problem. Please help me. I'm thankfull for every hint !

Greets Sebastian

ps: My properties in the .m file:

@interface ParseOperation () <NSXMLParserDelegate>
@property (nonatomic, retain) Photo *currentPhotoObject;
@property (nonatomic, retain) NSMutableArray *currentParseBatch;
@property (nonatomic, retain) NSMutableString *currentParsedCharacterData;
@end

@implementation ParseOperation

@synthesize photoData, currentPhotoObject, currentParsedCharacterData, currentParseBatch;


It's because you assign same NSMutableString instance to all this properties.

1) Declare author, titleText, locationText properties as copy to avoid this in future.

2) Make a copy each time you want to return value of NSMutableString or assign it to something

self.currentPhotoObject.titleText = [[self.currentParsedCharacterData copy] autorelease];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜