Совет XMLParser - PullRequest
       25

Совет XMLParser

0 голосов
/ 06 декабря 2011

Я не уверен, что я делаю неправильно. У меня есть URL, ведущий к дереву XML, которое выглядит следующим образом:

<result>
  ...
  <title>
  ...
  </title>
  <body>
  ...
  </body>
  ...
</result>

Мне просто нужно разобрать файл и получить заголовок и текст. Вот мой object.h:

#import <Foundation/Foundation.h>

@interface Object : NSObject 
{
    NSString    *title;
    NSString    *description;
}

@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *description;

@end

А вот Object.m:

#import "Object.h"

@implementation Object

@synthesize title, description;

-(void) dealloc
{
    [title release];
    [description release];
    [super dealloc];
}

@end

Вот мой XMLParser.h:

#import <Foundation/Foundation.h>
#import "Object.h"

@interface XMLParser : NSObject <NSXMLParserDelegate> 
{

    NSMutableString *currentNodeContent;

    NSMutableArray  *arrayOfObjects;
    NSXMLParser     *parser;
    Object          *currentObject;
}

@property (readonly, retain) NSMutableArray *arrayOfObjects;

-(id) loadXMLbyURL:(NSString *)urlString;

@end

И, наконец, XMLParser.m:

#import "XMLParser.h"
#import "Object.h"

@implementation XMLParser

@synthesize arrayOfObjects;

-(id) loadXMLbyURL:(NSString *)urlString
{
    arrayOfObjects  = [[NSMutableArray alloc] init];
    NSURL *url   = [NSURL URLWithString:urlString];
    NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];
    parser       = [[NSXMLParser alloc] initWithData:data];
    parser.delegate = self;
    [parser parse];
    return self;    
}

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

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if([elementName isEqualToString:@"result"])
    {
         currentObject = [Object alloc];
    }
}

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if([elementName isEqualToString:@"title"])
    {
         currentObject.title = currentNodeContent;
    }

    if([elementName isEqualToString:@"body"])
    {
         currentObject.description = currentNodeContent;
    }

    if([elementName isEqualToString:@"result"])
    {
        [arrayOfObjects addObject:currentObject];
        [currentObject release];
        currentObject = nil;
        [currentNodeContent release];
        currentNodeContent = nil;
    }
}

-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

@end

В своем основном коде я вызываю синтаксический анализатор XML следующим образом:

xmlParser = [[XMLParser alloc] loadXMLbyURL:@"www.websiteWithXML.com"];

Однако в мой arrayOfObjects ничего не помещается (я знаю это, потому что, когда я говорю табличному виду, что в нем столько строк, сколько в моем массиве, строк нет).

помогите пожалуйста !!! Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

Попробуйте сбросить currentNodeContent внутри каждого из ваших элементов. Например:

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if([elementName isEqualToString:@"result"])
    {
         currentObject = [Object alloc];
    }
    else if ([elementName isEqualToString:@"title"] || [elementName isEqualToString:@"body"])
    {
        [currentNodeContent setString:@""];
    }
}

Затем, когда вы получите символы, добавьте:

-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    [currentNodeContent appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
}

Делая это, вы обрабатываете ситуацию, когда foundCharacters получает несколько раз для захвата всех символов в данном элементе.

0 голосов
/ 06 декабря 2011

Не уверен, поможет ли это ...

Попробуйте изменить:

arrayOfObjects  = [[NSMutableArray alloc] init];

Кому:

arrayOfObjects  = [[NSMutableArray alloc] initWithCapacity:0];

Кроме того, похоже, что ваш код в порядке. Также то, что ваша таблица ничего не загружает, не означает, что в вашем массиве нет объектов. Используйте точки останова, чтобы взглянуть на ваши данные после того, как вы закончите анализ и перед тем, как попытаться загрузить свое табличное представление.

...