2011-12-05 3 views
0

내가 뭘 잘못하고 있는지 잘 모르겠다. 다음과 같은 XML 트리로 연결되는 URL이 있습니다.XMLParser Advice

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

파일을 구문 분석하고 제목과 본문을 가져와야합니다. 여기 Object.m됩니다

#import <Foundation/Foundation.h> 

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

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

@end 

: 그리고 여기 내 object.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 "Object.h" 

@implementation Object 

@synthesize title, description; 

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

@end 

내 XMLParser.h이다

#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 pa를 호출합니다. 이 같은 rser :

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

그러나 아무것도 내 arrayOfObjects (I가있는 tableview 내 배열만큼의 행을 가지고 말할 때, 어떤 행이 없기 때문에 나는 이것을 알고)에 배치되고 있지 않습니다.

도와주세요! 미리 감사드립니다.

+0

왜 배열에 읽기 전용 속성을 지정 했습니까 ...? non-atomic을 시도하십시오 –

+0

나는이 튜토리얼을 따라 갔다. http://www.theappcodeblog.com/2011/05/09/parsing-xml-in-an-iphone-app-tutorial/ – jisturiz

+0

그것은 훌륭하게 작동했지만, 내 사용을 위해 ... 그것은 나던 작동하지 않습니다! – jisturiz

답변

0

이 도움이 될 것입니다 확실하지 ...

변경해보십시오 :

arrayOfObjects = [[NSMutableArray alloc] init]; 

하려면 :

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

다른 것보다 당신의 코드가 좋은 것 같습니다. 또한 테이블에 아무것도로드하지 않는다고해서 배열에 객체가 없다는 것을 의미하지는 않습니다. 구문 분석을 마친 후와 테이블 뷰를로드하기 전에 중단 점을 사용하여 데이터를 살펴보십시오.

+0

Xcode4를 사용하고 있습니까? – Louie

+0

예, 저는 정말로입니다. – jisturiz

0

각 요소 시작 부분에서 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가 주어진 내에서 모든 문자를 캡처 할 여러 번 얻는 상황을 처리 요소.