#iphone #objective-c #xml #nsxmlparser
#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>
я передаю делегату только последние атрибуты для даты и имени, и я знаю, почему это происходит, но я не знаю, как это исправить. кто-нибудь может мне помочь
вот мой код objective 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 — это изменяемый массив в делегате приложения, а OpeningHoursView — это NSObject, который содержит имя и дату в виде строк в другом классе. Они также получают значение делегата приложения, и это также только последнее прочитанное значение для атрибутов «дата» и «имя» из XML-файла.
Я работаю с анализатором NSXML
итак, снова мой вопрос в том, как получить «openingHoursView.name » и «openingHoursView.date», чтобы записать каждое значение, которое они получают, в openingHoursSpecialDelegate, а не перезаписывать их, как это происходит сейчас
Комментарии:
1. откуда установить объект в attributeDict
2. не совсем понимаю ваш вопрос. Пожалуйста, объясните
Ответ №1:
Я не могу найти ничего неправильного в коде. Я поместил приведенный выше код в небольшой тестовый проект (с незначительными изменениями, чтобы сделать его автономным), и у меня он работает нормально.
Массив ( «Пасхальная пятница, 22/04/2011», «Пасхальная суббота, 23/04/2011», «Пасхальное воскресенье, 24/04/2011», «День Анзака, 25/04/2011», «Пасхальный вторник, 26/04/2011»)
Вам нужно будет изменить путь, который я жестко задал в классе test2AppDelegate, чтобы указать на файл, содержащий XML, который вы опубликовали выше.
Комментарии:
1. Да, я знаю, что такой синтаксический анализ работает. Я пытаюсь присвоить значение третьему классу, и оно находится в iOS, а не в macOS. Я действительно не знаю разницы, никогда не работал чистый cocoa, но. Я пытался передать делегат в другой файл, и я не могу. Пожалуйста, дайте совет
2. Боюсь, я не понимаю вашей проблемы. Можете ли вы загрузить проект xcode, в котором обнаружена проблема? Не просматривая больше кода, я не могу найти ничего неправильного в том, что у вас есть. (Кстати, это должно работать одинаково в macOS и iOS.)
3. моя проблема в том, что у меня есть один файл (класс), который является XMLParser и считывает XML-файл, затем отправляет значения в AppDelegate, и здесь я получаю только последнее значение, а не все из них. Любым способом спасибо за ваше время и помощь
4. Прошу прощения за этот опубликованный вопрос, все было в порядке, я перепутал некоторые имена переменных, и это была целая путаница, спасибо в любом случае за ваши ответы
Ответ №2:
Я уже решил эту проблему в своем проекте.Но я использую libxml2.
Проблема в том, что (узел day) вам нужно установить 5 разных значений для одного и того же ключа (day), поэтому вы получаете атрибут last.