Ios 解析本地xml文件并在表视图中显示数据

Ios 解析本地xml文件并在表视图中显示数据,ios,xml-parsing,nsxmlparser,Ios,Xml Parsing,Nsxmlparser,我试图解析我创建的一个简单的xml文件 我读了很多关于这个主题的教程,但仍然无法在模拟器上显示信息(我一直得到一个空列表) 我的xml文件: 第一本书的书名 举出一个 第二本书名 举两个例子 我的代码: @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {

我试图解析我创建的一个简单的xml文件

我读了很多关于这个主题的教程,但仍然无法在模拟器上显示信息(我一直得到一个空列表)

我的xml文件: 第一本书的书名 举出一个 第二本书名 举两个例子

我的代码:

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{
    NSString *xmlPath = [ [ NSBundle mainBundle ] pathForResource : @" Books.xml "       ofType:@"xml" ] ;
    NSData *xmlData = [ NSData dataWithContentsOfFile : xmlPath ] ;
    NSXMLParser *xmlParser = [ [ NSXMLParser alloc ] initWithData:xmlData ] ;
    XMLParser *parser = [ [ XMLParser alloc ] initXMLParser ] ;
   [ xmlParser setDelegate : parser ] ;
    BOOL success = [xmlParser parse];
if ( success )
    NSLog ( @" amount %i ", [ books count ] ) ;
else
    NSLog(@"Error!!!");
    return YES;
}

@implementation XMLParser

- (XMLParser *) initXMLParser
{
    self = [ super init ] ;
    appDelegate = ( AppDelegate * ) [ [ UIApplication sharedApplication ] delegate ] ;
    return self ;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
{
    if ( [ elementName isEqualToString : @" Books " ] )
{
appDelegate.books = [ [ NSMutableArray alloc ] init ] ;
}
else if ( [ elementName isEqualToString : @" Book " ] )
{
aBook = [ [ Book alloc ] init ] ;
aBook.bookID = [ [ attributeDict objectForKey : @" id " ] integerValue ] ;
NSLog(@"Reading id value :%i", aBook.bookID);
    }
    else if ( [ elementName isEqualToString : @" title " ] )
    {
        aBook.title = [[NSMutableString alloc] init];
   }
    else if ( [ elementName isEqualToString : @" author " ] )
    { 
        aBook.author = [[NSMutableString alloc] init];
    }
    NSLog ( @" Processing Element : %@", elementName ) ;
}

- ( void ) parser : ( NSXMLParser * ) parser foundCharacters : ( NSString * ) string
{   
    if ( !currentElementValue )
    {
    currentElementValue = [ [ NSMutableString alloc ] initWithString : string ] ;
    }
    else
    {
    [ currentElementValue appendString : string ] ;
    }
    NSLog ( @" Processing Value : %@ ", currentElementValue ) ;
}

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

{   
    if ( [ elementName isEqualToString : @" Books " ] )
    return;
    if ( [ elementName isEqualToString : @" Book " ] )
    {
    [ appDelegate.books addObject : aBook ] ;
        aBook = nil ;
    }
    else
    {
    [ aBook setValue : currentElementValue forKey : elementName ] ;
    }
    currentElementValue = nil ;
}
@end

@implementation MasterViewController

    - (void)awakeFromNib
{
    [super awakeFromNib];
}

- ( void ) viewDidLoad
{
    [ super viewDidLoad ] ;
    appDelegate = ( AppDelegate * ) [ [ UIApplication sharedApplication ] delegate ]     ;
    self.title = @" Books ";    
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

#pragma mark - Table View

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:    (NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"         forIndexPath:indexPath];
    aBook = [appDelegate.books objectAtIndex:indexPath.row];
    cell.textLabel.text = aBook.title;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    return cell;
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDate *object = _objects[indexPath.row];
       // [[segue destinationViewController] setDetailItem:object];
    }
}

@end

有人能帮我找出我做错了什么吗?

您几乎总是在字符串中添加前导和尾随空格。我怀疑这是你想要的

您还可以对文件路径执行此操作,并将.xml扩展名添加到资源名称中,这在使用
pathForResource:ofType:
时是不应该执行的

假设您的文件名为“Books.xml”,请使用此选项检索xml文件的路径:

NSString *xmlPath = [[NSBundle mainBundle] pathForResource : @"Books" ofType:@"xml"];

使用appdelegate作为全局变量的“倾卸场”是一个糟糕的设计选择。定义并使用单独的模型类;为它添加一个单例(这里是一个解释方法)。不是说你不应该学习如何解析XML,而是说你有什么理由不能使用plist?@dasblinkenlight,首先,感谢你的帮助,但我不知道如何使用你的建议。代码不能使用appDelegate吗?@user1868558
appDelegate
类应该“尽可能空”。阅读MVC(模型-视图-控制器)模式,您将在iOS编程中大量使用它。实现中的模型将转储到app delegate中。这是不正确的。让你的模型成为一个单独的类。为了确保对您的模型的普遍访问,请将其设置为单例。@Wain,也谢谢您。正如我提到的,我刚刚开始学习ios编程,对plist并不熟悉。此外,目前我正在专门学习如何解析xml文件非常感谢,模拟器上的列表仍然是空的,但现在我可以看到文件正在被解析。有人告诉我添加空格以使代码更具可读性,我想从现在起我将停止这样做。我可以在Xcode的输出中看到xml文件中的元素正在被读取,只是在模拟器上看不到任何东西。你对问题出在哪里有什么建议吗?