티스토리 뷰

참고 사이트

아이폰 개발센터
Introduction to Event-Driven XML Programming Guide for Cocoa

블로그 http://cocoadev.tistory.com/245 를 참고 하였습니다.

1. 접속

 
NSURL *url = [[NSURL alloc] initWithString:@"http://sites.google.com/site/iphonesdktutorials/xml/Books.xml"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

대상 XML (NSString 타입)의 주소를 인자로 NSURL 을 생성한다.
NSXMLParser 오브젝트를 수신된 url을 인자로 초기화 한다.

2. delegate 초기화

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

initXMLParser 로 Delegate 를 초기화 해준다.

3. Set delegate

[xmlParser setDelegate:parser];
[xmlParser parse];


delegate를 지정하고 XML 파일을 파싱한다. parse 메소드로 파싱이 시작된다.  각 단계별로 delegate된 메소드를 구현하여 직접 처리해줘야 한다.

4. Delegate 메소드 구현

NSXMLParser의 많은 delegate 중에 필수적으로 구현되어야 할 메소드는

parser:didStartElement, parser:foundCharacters, parse:didEndElement 이다.


1) parser:didStartElement 메소드 (시작 메소드) 구현

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

두번째 인자인 elementName 으로 해당 요소의 이름이 전달된다. 세번째와 네번째 인자는 네임스페이스와 관련된 URI 와 전체 이름이 전달된다.
마지막 인자인 attributeDict 에는 해당 요소의 속성들이 전달된다.
Books  가 전달되면 array 를 초기화하고, Book 이 전달 되면 Book 객체를 초기화 하고 요소들을 뽑아내서 출력하게 된다.

2) parser:foundCharacters 메소드 (데이터 저장 메소드) 의 구현

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

 토큰 별로 넘어오는 문자열을 currentElement요소의 위치에 저장한다.

3) parser:didEndElement 메소드 (종료 메소드) 구현

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
   
    if([elementName isEqualToString:@"Books"])
        return;
   
    //There is nothing to do if we encounter the Books element here.
    //If we encounter the Book element howevere, we want to add the book object to the array
    // and release the object.
    if([elementName isEqualToString:@"Book"]) {
        [appDelegate.books addObject:aBook];
       
        [aBook release];
        aBook = nil;
    }
    else
        [aBook setValue:currentElementValue forKey:elementName];
   
    [currentElementValue release];
    currentElementValue = nil;
}


한 요소가 끝날때 호출되는데, aBook 객체의 elementName에 currentElementValue를 저장하고 모두 끝났을 때에 메모리를 반납해준다.


www.iPhoneSDKArticles.com 의 XML 관련 예제 소스를 첨부했으니 참고 하세요~
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함