Эй, мне нужно разобрать XML в моем приложении для iOS.Я взял Apple SeismicXML Sample в качестве своей базы, но у меня действительно странное поведение.
Вот мои методы синтаксического анализа:
- (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];
}
}
Все отлично работает, данные XML поступают правильно.Парсер разбирает все как надо.Проблема в синтаксическом анализаторе didEndElement.
else if ([elementName isEqualToString:kTitleElementName]) {
self.currentPhotoObject.titleText = self.currentParsedCharacterData;
}
Когда я получаю «self.currentPhotoObject.titleText» через NSLog, я получаю правильные проанализированные данные.Но тогда:
else if ([elementName isEqualToString:kAuthorElementName]) {
self.currentPhotoObject.author = self.currentParsedCharacterData;
}
Когда я получаю NSLog "self.currentPhotoObject.titleText" и из "self.currentPhotoObject.author" здесь, оба дают мне автора.В третьем разобранном методе это то же самое.Все три свойства (titleText, author и locationText) являются locationText.
Я понятия не имею, почему .titleText например изменяется, когда парсер устанавливает .author.
Я дважды проверил все, по крайней мере, 10раз и сравнил его с образцом SeismicXML, но я не могу найти проблему.Пожалуйста, помогите мне.Я благодарен за каждую подсказку!
Привет, Себастьян
ps: Мои свойства в файле .m:
@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;