2013-08-16 2 views
0

다음 XML을 webservicex.net, 및 iPhone 응용 프로그램에서 구문 분석해야합니다. 일부 NSArray/NSDictionary 또는 뭔가에 절 VerseBibleWords 저장해야합니다.문제 분석 XML 및 데이터 가져 오기

<string xmlns="http://www.webserviceX.NET"> 
<NewDataSet> 
    <Table> 
    <Book>1</Book> 
    <BookTitle>Genesis</BookTitle> 
    <Chapter>1</Chapter> 
    <Verse>1</Verse> 
    <BibleWords>In the beginning God created the heaven and the earth.</BibleWords> 
    </Table> 
    <Table> 
    <Book>1</Book> 
    <BookTitle>Genesis</BookTitle> 
    <Chapter>1</Chapter> 
    <Verse>2</Verse> 
    <BibleWords>And the earth was without form, and void; and darkness was upon the face of the deep. And the Spirit of God moved upon the face of the waters.</BibleWords> 
    </Table> 
    <Table> 
    <Book>1</Book> 
    <BookTitle>Genesis</BookTitle> 
    <Chapter>1</Chapter> 
    <Verse>3</Verse> 
    <BibleWords>And God said, Let there be light: and there was light.</BibleWords> 
    </Table> 
    <Table> 
    <Book>1</Book> 
    <BookTitle>Genesis</BookTitle> 
    <Chapter>1</Chapter> 
    <Verse>4</Verse> 
    <BibleWords>And God saw the light, that it was good: and God divided the light from the darkness.</BibleWords> 
    </Table> 
</NewDataSet> 
</string> 

데이터를 구문 분석하기위한 다음 코드를 작성했습니다.

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

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if(!currentElementValue) { 
     currentElementValue = [[NSMutableString alloc]initWithString:string]; 
    } 

    else { 
     [currentElementValue appendString:string]; 
    } 

    NSLog(@"%@", currentElementValue); 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"NewDataSet"]) { 
     return; 
    } 

    if ([elementName isEqualToString:@"Table"]) { 
     [verses addObject:model]; 
     model = nil; 
    } 
    else { 
     [model setValue:currentElementValue forKey:elementName]; //The exception break point hits here 
    }  

    currentElementValue = nil; 
} 

currentElementValue이 올바르게 표시됩니다. modelModel이라는 클래스의 개체이며 currentElementValueNSMutableString 개체 인 versesNSMutableArray입니다. 나는 객관적인 C 초보자이며 전에 파싱을하지 않았다. 문제는 메서드가 다음과 같습니다.

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

이 예상대로 작동하지 않습니다. 코드에서 주석 처리 한 예외 브레이크 포인트를 치면 응용 프로그램이 손상되었습니다. VerseBibleWords의 값을 얻고 얼마큼 NSArray/NSMutableArray/NSDictionary/NSMutableDictionary에 저장할 수 있습니까? 문제가 실제로 어디에 있는지 보려면 언급해야 할 것이 있는지 물어보십시오.

편집 :

이 함께 시도 :

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    captureCharacters = NO; 
    [currentElementValue setString : @""]; 
    if ([elementName isEqualToString:@"Table"]) { //set a break point here as well. The elementName is string and hence is not entering any of the conditions in this delegate method. Hence captureCharacters is always set to NO and nothing is working. 
     model = [[Model alloc]init];   
    } 
    else if ([elementName isEqualToString:@"Verse"]) { 
     capturingCharacters = yes; 
    } 

    else if ([elementName isEqualToString:@"BibleWords"]) { 
     capturingCharacters = yes; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if(capturingCharacters) { 
     [currentElementValue appendString:string]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"Table"]) { 
     [array addObject : model]; 
     model = nil;   
    } 
    else if ([elementName isEqualToString:@"Verse"]) { //set a break point here 
     model.Verse = currentElementValue; //not entering this condition 
    } 

    else if ([elementName isEqualToString:@"BibleWords"]) { 
     model.BibleWords = currentElementValue; //not entering this condition 
    }   
} 

그것은 작동하지 않습니다와 나는 model.Versemodel.BibleWords에 null 값을 얻고있다. 이 방법은 어떻게 작동합니까?

EDIT -2-
모델 인터페이스 :

//model.h 
@protocol HttpRequestHandler <NSObject> 

- (void)returnFromSiteParsedData:(NSMutableArray *)parsedData; 

@end 

@interface Model : NSObject <NSURLConnectionDelegate, NSXMLParserDelegate> 
{ 
    NSString *urlToLoad; 
    NSMutableURLRequest *requestSiteToSendData; 
    NSURLConnection *connectionToSiteToSendData; 

    NSString *verseText; 
    int verseNumber; 

} 
@property(nonatomic, retain) NSString *verseText; 
@property(nonatomic, assign) int verseNumber; 

- (void)loadSiteToSendDataWithChapterNumber:(int)chapterNumber AndBookNumber:(int)bookNumber; 

@property(nonatomic, retain)id<HttpRequestHandler>httpRequestHandlerDelegate; 

@end 

모델 구현

//model.m 
@implementation Model 

@synthesize verseNumber; 
@synthesize verseText; 

- (void)loadSiteToSendDataWithChapterNumber:(int)chapterNumber AndBookNumber:(int)bookNumber { 

    urlToLoad = [[NSString alloc]initWithFormat:@"http://www.webservicex.net/BibleWebservice.asmx/GetBibleWordsByBookTitleAndChapter?BookTitle=Genesis&chapter=1"]; 
    requestSiteToSendData = [NSMutableURLRequest requestWithURL:[[NSURL alloc]initWithString:urlToLoad] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30]; 
    connectionToSiteToSendData = [[NSURLConnection alloc]initWithRequest:requestSiteToSendData delegate:self];  

} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 

    // Parse the XML into a dictionary 
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; 
    VBSParser *vbsParser = [[VBSParser alloc]initVBSParser]; 
    [parser setDelegate:vbsParser]; 
    BOOL success = [parser parse]; 

    if (success) { 
     NSMutableArray *verses = [vbsParser verses]; 
     NSLog(@"%@", verses); 
     NSLog(@"Number: %d\n Text: %@", verseNumber,verseText); 
     [self.httpRequestHandlerDelegate returnFromSiteParsedData:verses]; 
    } 
    // Print the dictionary 

} 

@end 

대리자 뷰 컨트롤러 파싱 된 데이터를 리턴하는 데 사용된다.

+0

제 편집을 참조하십시오. –

+0

모델 클래스보기 –

+0

편집을 참조하십시오. –

답변

1

BOOL capturingCharacters;

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    captureCharacters = NO; 
    [currentElementValue setString : @""]; 
    if ([elementName isEqualToString:@"Table"]) { 
     model = [[Model alloc]init];   
    } 
    else if ([elementName isEqualToString:@"Verse"]) { 
     capturingCharacters = yes; 
    } 

    else if ([elementName isEqualToString:@"BibleWords"]) { 
     capturingCharacters = yes; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if(capturingCharacters) { 
     [currentElementValue appendString:string]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"Table"]) { 
     [array addObject : model]; 
     model = nil;   
    } 
    else if ([elementName isEqualToString:@"Verse"]) { 
     model.Verse = currentElementValue; 
    } 

    else if ([elementName isEqualToString:@"BibleWords"]) { 
     model.BibleWords = currentElementValue; 
    }   
} 
관련 문제