2011-12-27 25 views
0

我以前問過這個問題XMLParser Advice絕望的NSXMLParser指導

但是我仍然無法得到它才能正常工作....

所以我想我將從頭開始:

位於某個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建議](http://stackoverflow.com/questions/8392089/xmlparser-advice) – 2011-12-27 21:15:42

+1

不要只是重新發佈一個問題。您應該編輯您的原稿以便在必要時更加清晰,這也會將其打印到首頁。 – jrturton 2011-12-27 21:50:18

+0

謝謝你的建議@jrturton – jisturiz 2011-12-27 22:20:29

回答

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 2011-12-27 22:12:02

+2

你正在做一個同步調用,它會阻止當前線程。 initWithContentsOfURL旨在用於應用程序包中的文件。 – 0x8badf00d 2011-12-27 22:14:35

+0

@ 0x8badf00d - 這是很好的一點。作爲NSXMLParser指導,我認爲該示例仍然有效。 – 2011-12-27 22:17:41