Анализ двух XML-файлов вместе

#ios #xml #nsxmlparser

#iOS #xml #nsxmlparser

Вопрос:

У меня есть два xml файла, которые мне нужно проанализировать одновременно, используя анализатор NSXMl (не последовательно). Эти файлы содержат разные данные, которые будут отображаться в uiLabel's в tableviewCell . Я успешно проанализировал один XML-файл. Я также заглянул в документы Apple, но там говорится, что вы можете анализировать только один XML-файл за раз. есть ли какой-либо другой способ сделать это? Пожалуйста, помогите

Вот как я сейчас разбираю два xm-файла.

 - (void)viewDidLoad
  

{

 if(!_suraDict || ![_suraDict count])
{
    _suraTitle = [NSMutableArray array];
    _suraDict =[NSMutableDictionary dictionary];
    _indexArray = [NSMutableArray array];
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"simple" ofType:@"xml"];
    NSData *Mydata = [NSData dataWithContentsOfFile:filePath];

    _transTitle = [NSMutableArray array];
    _transDict =[NSMutableDictionary dictionary];
    _indexArray2 = [NSMutableArray array];
    NSString *filePath2 = [[NSBundle mainBundle] pathForResource:@"en.yusufali" ofType:@"xml"];
    NSData *Mydata2 = [NSData dataWithContentsOfFile:filePath2];
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:Mydata];
    NSXMLParser *parser2 = [[NSXMLParser alloc]initWithData:Mydata2];

    [parser2 setDelegate:self];
    [parser2 parse];
    [parser setDelegate:self];
    [parser parse];
}

else{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
       self.detailViewController.detailItem = [ _suraDict valueForKey:[_indexArray objectAtIndex:0]];
        self.detailViewController.detailItem2 = [ _transDict valueForKey:[_indexArray2 objectAtIndex:0]];
        }
    }

[super viewDidLoad];

   self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
}


    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    if([elementName isEqualToString:@"sura"]){

        _sura = [NSMutableString string];

        _sura = [attributeDict objectForKey:@"name"];
    }
    else if([elementName isEqualToString:@"aya"]){
        _aya = [NSMutableString string];

        [_suraTitle addObject:[attributeDict objectForKey:@"text"]];
    }

}

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

    if([elementName isEqualToString:@"sura"]){
        [_suraDict setObject:_suraTitle forKey:_sura];
        [_indexArray addObject:_sura];
        _suraTitle = [NSMutableArray array];
    }
}

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

     //  NSLog(@"foundCharacters : %@", string);

}

- (void)parserDidEndDocument:(NSXMLParser *)parser{

    [[AppDelegate modelController]setcountArrayDict:_suraDict];
    [[AppDelegate modelController]setIndexArray:_indexArray];

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        self.detailViewController.detailItem = [ _suraDict valueForKey:[_indexArray objectAtIndex:0]];
    }
}

- (void)parser2:(NSXMLParser *)parser2 didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict2{
    if([elementName isEqualToString:@"sura"]){

        _sura2 = [NSMutableString string];

        _sura2 = [attributeDict2 objectForKey:@"name"];
    }
    else if([elementName isEqualToString:@"aya"]){
        _trans = [NSMutableString string];

        [_transTitle addObject:[attributeDict2 objectForKey:@"text"]];
    }

}

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

    if([elementName isEqualToString:@"sura"]){
        [_transDict setObject:_transTitle forKey:_sura2];
        [_indexArray2 addObject:_sura2];
        _transTitle = [NSMutableArray array];
    }
}

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

        NSLog(@"foundCharacters : %@", string);

}

- (void)parser2DidEndDocument:(NSXMLParser *)parser2{

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        self.detailViewController.detailItem2 = [ _transDict valueForKey:[_indexArray2 objectAtIndex:0]];
    }
}

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender   //valueforkey means the aayahs
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

        DetailViewController *viewcontroller= [segue destinationViewController];
        viewcontroller.selectedRow=indexPath.row;
        [viewcontroller setDetailItem:[ _suraDict valueForKey:[_indexArray objectAtIndex:[indexPath row]]]];
        [viewcontroller setDetailItem2:[ _transDict valueForKey:[_indexArray objectAtIndex:[indexPath row]]]];
    }
}
  

Комментарии:

1. Вы анализируете два XML-файла в один UITabeView?

2. Да, у меня есть две метки внутри uitableviewcell, которые мне нужно заполнить. я разобрал один файл в одну метку, но второй не разбирается. мне кажется, это причина настройки делегирования, потому что я могу одновременно устанавливать делегирование только для одного файла

3. В чем проблема с их анализом один за другим? Если это для TableView, вы можете повторно загрузить данные после завершения анализа обоих.

4. Должно быть, я сделал что-то не так. я публикую свой код здесь. Пожалуйста, посмотрите, что я сделал не так, пожалуйста

5. Присвоение имен методам делегирования по-разному не сработает (NSXMLParser всегда будет вызывать точное имя в соответствии с протоколом). В каждом методе делегирования либо проверьте, какой файл анализируется в данный момент, либо (лучше) создайте отдельные классы синтаксического анализатора для каждого файла.