Как анализировать два разных файла .xml одновременно? - PullRequest
0 голосов
/ 06 августа 2011

Я использую приложение панели вкладок, и есть 4 различных вида таблицы. Есть четыре элемента панели вкладок, и у каждого есть свое представление таблицы. Я должен заполнить массивы из файлов .xml. Тем не менее, проблема заключается в следующем:

Я могу анализировать только один XML файл за раз. Как можно проанализировать два или более файлов .xml одновременно по NSXMLParser?

Или я должен объединить xml files? Yet, if I merge, I have to create two or more NSMutableArray, чтобы поместить их в другие представления табличного представления. Любое предложение?

Что вы, ребята, предлагаете? Я не знаю, как объединить эти XML-файлы, но даже если я это сделаю, я должен создать NSMutableArray s, чтобы использовать их для заполнения массивов для каждого представления.

Заранее спасибо.

Edit:

Это мой AppDelegate.m

@synthesize window = _window;
@synthesize tabBarController = _tabBarController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {

//Initialize the delegate.
XMLParser *parser = [[XMLParser alloc] initXMLParser];

// Configure and show the window
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
[window makeKeyAndVisible];
}


- (void)applicationWillTerminate:(UIApplication *)application {
// Save data if appropriate
}


- (void)dealloc {
[tabBarController release];
[window release];
[super dealloc];
}

@end

Это мой XMLparser.m:

#import "XMLParser.h"
#import "XMLAppDelegate.h"
#import "Duyuru.h"
#import "Beste.h"
#import "BesteViewController.h"
#import "DuyuruViewController.h"

@implementation XMLParser

- (XMLParser *) initXMLParser {

[super init];

appDelegate = (XMLAppDelegate *)[[UIApplication sharedApplication] delegate];

return self;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
 namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
attributes:(NSDictionary *)attributeDict {


if (parser == bestevc.parser ) {

    if([elementName isEqualToString:@"Besteler"]) {
    //Initialize the array.
    bestevc.besteler = [[NSMutableArray alloc] init];
    }

    else if([elementName isEqualToString:@"Beste"]) {

        //Initialize the book.
        aBeste = [[Beste alloc] init];

        //Extract the attribute here.
        aBeste.besteID = [[attributeDict objectForKey:@"id"] integerValue];

        NSLog(@"Reading id value :%i", aBeste.besteID);
    }

 }

if (parser == duyuruvc.parser  ) {

    if([elementName isEqualToString:@"Duyurular"]) {
        //Initialize the array.
        duyuruvc.duyurular = [[NSMutableArray alloc] init];
    }

    else if([elementName isEqualToString:@"Duyuru"]) {

        //Initialize the book.
        aDuyuru = [[Duyuru alloc] init];

        //Extract the attribute here.
        aDuyuru.duyuruID = [[attributeDict objectForKey:@"id"] integerValue];

        NSLog(@"Reading id value :%i", aDuyuru.duyuruID);
    }

  }

}

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

 if (parser == bestevc.parser  ) {
    if(!currentElementValue1) 
        currentElementValue1 = [[NSMutableString alloc] initWithString:string];
    else
        [currentElementValue1 appendString:string];

    NSLog(@"Processing Value: %@", currentElementValue1);
}

if (parser == duyuruvc.parser  ) {
    if(!currentElementValue2) 
        currentElementValue2 = [[NSMutableString alloc] initWithString:string];
    else
        [currentElementValue2 appendString:string];

    NSLog(@"Processing Value: %@", currentElementValue2);
}
}

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

   if (parser == bestevc.parser) {

    if([elementName isEqualToString:@"Besteler"])
    return;
    //There is nothing to do if we encounter the Books element here.

    // and release the object.
    if([elementName isEqualToString:@"Beste"]) {
        [bestevc.besteler addObject:aBeste];

        [aBeste release];
        aBeste = nil;
    }
    else 
        [aDuyuru setValue:currentElementValue1 forKey:elementName];

    [currentElementValue1 release];
    currentElementValue1 = nil;
}
if (parser == duyuruvc.parser) {

    if([elementName isEqualToString:@"Duyurular"])
        return;
    //There is nothing to do if we encounter the Books element here.

    // and release the object.
    if([elementName isEqualToString:@"Duyuru"]) {
        [duyuruvc.duyurular addObject:aDuyuru];

        [aDuyuru release];
        aDuyuru = nil;
    }
    else 
        [aDuyuru setValue:currentElementValue2 forKey:elementName];

    [currentElementValue2 release];
    currentElementValue2 = nil;
}

}


- (void) dealloc {
[aDuyuru release];
[aBeste release];
[currentElementValue1 release];
[currentElementValue2 release];
[super dealloc];
}

@end

Это мой BesteViewController.m:

#import "BesteViewController.h"
#import "XMLAppDelegate.h"
#import "Beste.h"
#import "XMLParser.h"

@implementation BesteViewController
 @synthesize parser, besteler;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)
 section   {
  return [besteler count];
 }


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath
 (NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero
  reuseIdentifier:CellIdentifier] autorelease];
 }

Beste *aBeste = [besteler objectAtIndex:indexPath.row];

[[cell textLabel] setText:aBeste.name];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

// Set up the cell
return cell;
}

- (void)viewDidLoad {
[super viewDidLoad];
// Uncomment the following line to add the Edit button to the navigation bar.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;

appDelegate = (XMLAppDelegate *)[[UIApplication sharedApplication] delegate];

NSURL *url = [[NSURL alloc] 
      initWithString:@"https://sites.google.com/site/bfbremoteser
   ver/iphoneapp/besteler.xml"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];


//Initialize the delegate.
XMLParser *parser = [[XMLParser alloc] initXMLParser];


//Set delegate
[xmlParser setDelegate:parser];


//Start parsing the XML file.
BOOL success = [xmlParser parse];

if(success)
    NSLog(@"No Errors");
else
    NSLog(@"Error Error Error!!!");

self.navigationItem.title = @"Besteler";
 }







/*
// Override to support rearranging the list
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath   

 *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/


/*
 // Override to support conditional rearranging of the list
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath*)
indexPath {
// Return NO if you do not want the item to be re-orderable.
return YES;
}
*/

/*
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
}
*/
/*
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
  */
/*
- (void)viewWillDisappear:(BOOL)animated {
}
*/
/*
- (void)viewDidDisappear:(BOOL)animated {
}
*/




- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}


- (void)dealloc {
[besteler release];
[appDelegate release];
[super dealloc];
}


@end

1 Ответ

1 голос
/ 06 августа 2011

Я не уверен, что правильно понял ваш вопрос, поэтому, пожалуйста, попробуйте предоставить более подробную информацию, и я отредактирую свой ответ, если необходимо.

У вас должен быть отдельный экземпляр NSXMLParser для каждого файла XML, который вы хотите проанализировать. В вашем случае, вероятно, должен быть один экземпляр NSXMLParser в каждом из контроллеров представления на панели вкладок.

Вы можете запустить их все, даже используя один и тот же NSXMLParserDelegate для всех них, потому что все методы делегата сообщают вам, какой экземпляр NSXMLParser вызвал их.

Edit:

Вы должны переместить этот код в контроллеры представления на контроллере панели вкладок:

NSURL *url = [[NSURL alloc]   initWithString:@"..."];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];


//Initialize the delegate.
XMLParser *parser = [[XMLParser alloc] initXMLParser];

//Set delegate
[xmlParser setDelegate:parser];


//Start parsing the XML file.
BOOL success = [xmlParser parse];

if(success)
    NSLog(@"No Errors");
else
    NSLog(@"Error Error Error!!!");

кроме этой строки (сохраните ее в appdelegate и передайте ссылку на нее во все контроллеры представления на контроллере панели вкладок, которые должны что-то анализировать):

XMLParser *parser = [[XMLParser alloc] initXMLParser];

Затем установите синтаксический анализатор (экземпляр NSXMLParser) как свойство на ваших контроллерах представления и внутри проверки xmlParse, который из анализаторов вызвал делегат, и действуйте соответственно. Например:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict {
    if (parser == firstViewController.parser) {
        // first tab called this parser delegate method, insert code to parse it here
    } else if (parser == firstViewController.parser) {
        // second...and so on
    }
}
...