Разбор XML для iPhone (aMule загрузки / результаты поиска) - PullRequest
0 голосов
/ 06 января 2010

В настоящее время я работаю над программным обеспечением для контроля состояния моего сервера через iPhone, я создал сокет, который выплевывает xml, который должен быть проанализирован, но поскольку NSXMLParser является источником событий, у меня возникают проблемы с пониманием, как это может работать ... Я думал об этом типе структуры XML, если у вас есть идеи о лучшем способе структурирования, пожалуйста, скажите мне !! : D

<root type="donwloads">   <-- specifies downloads or search results
<file name="Ubuntu_9_10.iso" status="[11,6%]" />
<file name="Fedora 12.iso" status="[56,2%]" />
</root>

Что я думал, так как я хочу поместить это в табличное представление, скорее всего мне понадобится NSMutableArray с множеством NSDictionaries, основанных на результатах, каждый дикт должен быть файлом ... что вы, ребята, предлагаете ?? как мне справиться с этой ситуацией?

Спасибо

Ответы [ 3 ]

1 голос
/ 06 января 2010

NSMutableArray из NSDictionary кажется разумным подходом для вашей структуры данных в памяти.

По сути, у вас будет ряд обратных вызовов, которые создают этот массив, когда NSXMLParser проходит через ваш XML-файл:

- (void) parseXML:(NSString *) filename {
    NSURL *xmlURL = [NSURL fileURLWithPath:filename];

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];

    [xmlParser setDelegate:self];

    [xmlParser parse];

    // Check for errors.
    NSError *errorCode = [xmlParser parserError];
    if (errorCode) {
        // handle error here
        NSLog(@"%@", [errorCode localizedDescription]);
    }

    [xmlParser release];
}

И ваш главный делегат:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    // If certain elements are found initialize the object
    if ([elementName isEqualToString:"@file"]) {
       NSMutableDictionary *currentFile = [[NSMutableDictionary alloc] init];
       // Look through the attributes add stuff to your dictionary
       // Add it to your array.
    }
}

Поскольку все ваши данные возвращаются в атрибутах, вы можете сделать это следующим образом. В противном случае вам нужно будет сохранить файл и собрать его (делегат foundCharacters), наконец, добавив его в ваш массив, когда тег файла появится в делегате didEndElement.

1 голос
/ 06 января 2010

Большое спасибо за ваши ответы: D К счастью, я решил проблему через 10 минут: D плохо пост, что я сделал:

XML:

<root>
  <downloads>
<file type="text" name="fdsdf" />
<file type="text" name="sdfsdfssds" />
  </downloads>
</root>

NSXMLParser делегатов:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName       namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
if([elementName isEqualToString:@"downloads"] || [elementName isEqualToString:@"results"]){
    NSLog(@"starting or downloads or results");
    if(xmlArray){
        xmlArray= nil;
    }
    self.xmlArray= [[NSMutableArray alloc] init];
}
else if([elementName isEqualToString:@"file"]){
    NSLog(@"found file...");
    [self.xmlArray addObject:attributeDict];
   }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if([elementName isEqualToString:@"downloads"] || [elementName isEqualToString:@"results"]){
    if([elementName isEqualToString:@"downloads"]){
        NSLog(@"downloads found: %@...  reloading table", xmlArray);
    }
  }
}

Надеюсь, это может помочь кому-то, у кого такая же проблема: D

1 голос
/ 06 января 2010

Напишите класс синтаксического анализатора, который превращает узлы в управляемые объекты Core Data и сохраняет их в контексте управляемого объекта при срабатывании события обратного вызова анализатора.

Используйте NSFetchedResultsController для доступа к Базовому хранилищу данных. Когда управляемые объекты входят и сохраняются, контроллер результатов обновляет табличное представление с любыми полученными результатами.

...