#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 всегда будет вызывать точное имя в соответствии с протоколом). В каждом методе делегирования либо проверьте, какой файл анализируется в данный момент, либо (лучше) создайте отдельные классы синтаксического анализатора для каждого файла.