2011-12-27 3 views
0

이전에이 질문을 던졌습니다. XMLParser Advice. NSXMLParser Guidance에 필사적 임

그래서 나는 처음부터 시작됩니다 생각 나는 여전히 제대로 작동하려면 얻을 수 없습니다입니다 그러나

.... : 특정 URL에 위치한

처럼 보이는 XML 트리입니다
<result> 

    //stuff that I dont need 

    <title> 
     //thing that I do need 
    </title> 

    //stuff that I dont need 

    <body> 
     //thing that I do need 
    </body> 

<result> 

구문 분석에 대해 어떻게해야합니까? 내가 가지고있는 (쓸모없는) 코드는이 질문의 상단에있는 링크에서 찾을 수 있습니다.

감사합니다.

+1

가능한 중복 [XMLParser Advice] (http://stackoverflow.com/questions/8392089/xmlparser-advice) –

+1

질문을 다시 게시하지 마십시오. 필요한 경우 원본을 편집하여 명확하게 만들어야합니다. 그러면 원본 페이지와 충돌하게됩니다. – jrturton

+0

조언을 주셔서 감사합니다. @jrturton – jisturiz

답변

2

파서의 위임이 될 간단한 클래스를 작성하십시오.

@interface YourObject : NSObject <NSXMLParserDelegate> { 
    NSString *title, *body; // object attributes 
    NSXMLParser *parser;  // will parse XML 
    NSMutableString *strData; // will contains string data being parsed 
} 

@property(readwrite, copy) NSString *title, body; 

// will be used to set your object attributes 
-(void)fetchValuesAtURL:(NSString *)url; 

@end 

fetchValuesAtURL: 메서드는 구문 분석 작업을 시작합니다. 그런 다음

@implementation YourObject 

@synthesize title, body; 

-(id)init { 
    self = [super init]; 
    if(self) { 
     title = @""; 
     body = @""; 
     parser = nil; 
     strData = [[NSMutableString alloc] initWithCapacity:10]; 
    } 
    return self; 
} 

-(void)fetchValuesAtURL:(NSString *)url { 
    if(parser) { 
     [parser release]; 
    } 
    NSURL *xmlURL = [NSURL URLWithString:url]; 
    parser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 
    [parser setDelegate:self]; 
    [parser parse]; 
} 

-(void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qName 
     attributes:(NSDictionary *)attributeDict { 
    // element is about to be parsed, clean the mutable string 
    [strData setString:@""]; 
} 

// the probably missing method 
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    // content (or part of) has been found, append that to the current string 
    [strData appendString:string]; 
} 

-(void)parser:(NSXMLParser *)parser 
    didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qName { 
    // element has been parsed, test the element name 
    // and store strData accordingly 
    if([elementName isEqualToString:@"title"]) { 
     self.title = strData; 
    } 
    else { // or else if, here you got two elements to parse 
     self.body = strData; 
    } 
} 

-(void)dealloc { 
    [title release]; 
    [body release]; 
    [strData release]; 
    if(parser) { 
     [parser release]; 
    } 
    [super dealloc]; 
} 

@end 

:

YourObject *obj = [[YourObject alloc] init]; 
[obj fetchValuesAtURL:@"http://www.site.com/xml/url"]; 

NSXMLParser의 대표는 애플 Event-Driven XML Programming Guide에 설명 된대로, 더 많은 일을 할 수 있습니다.
대리자 메서드에 대한 자세한 내용은 NSXMLParserDelegate Protocol Reference을 참조하십시오.

+0

고맙습니다. – jisturiz

+2

현재 스레드를 차단하는 동기식 호출을하고 있습니다. initWithContentsOfURL은 응용 프로그램 번들 내의 파일에 사용됩니다. – 0x8badf00d

+0

@ 0x8badf00d - 좋은 지적입니다. 이 예제는 NSXMLParser 지침에 따라 유효합니다. –