2013-08-01 51 views
0

我打算開發一個應用程序,以便根據用戶輸入從文件中檢索部分xml數據。我的代碼適用於檢索xml文件的內容,但我無法弄清楚要求解析器給我所有元素(例如攝入名稱=「TMF1202」)的最佳方式...用戶將給進名作爲輸入和解析器將檢索只存在於攝入標籤的元素,這是我的解析器代碼:過濾XML解析器數據

#import "Parser.h" 
#import "TimeTableViewController.h" 

@implementation Parser 
@synthesize currentElementPointer, rootElement; 

-(id)initParser 
{ 
    if(self = [super init]) { 
     tvc = (TimeTableViewController*)[[UIApplication sharedApplication]delegate]; 
    } 
    return self; 
} 
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 

    if(self.rootElement == nil) { 
     self.rootElement = [[List alloc]init]; 
     self.currentElementPointer = self.rootElement; 
    } else { 
     List *newList = [[List alloc]init]; 
     newList.parent = self.currentElementPointer; 
     [self.currentElementPointer.subElements addObject:newList]; 
     self.currentElementPointer = newList; 
    } 

    self.currentElementPointer.name = elementName; 
    self.currentElementPointer.attributes = attributeDict; 

    // theList.intake = [[attributeDict objectForKey:@"name"]stringValue]; 
} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if([self.currentElementPointer.text length] > 0) { 
     self.currentElementPointer.text = [self.currentElementPointer.text stringByAppendingString:string]; 
    } else { 
     self.currentElementPointer.text = string; 
    } 
} 


-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    self.currentElementPointer = self.currentElementPointer.parent; 
} 

@end 

這是我的XML文件的結構:

XML Format

回答

3

假設你想讓這個解析器像它一樣工作,但是根本不解析我們的XML文檔的任何元素(或子元素) e intake元素的name屬性不等於TMF1202,可以使用BOOL標誌指示是否應該解析樹的這個分支。例如。一種方法可能是:

  1. 創建一個BOOL屬性,該屬性指定是否目前正在解析與否:

    @property (nonatomic, getter = isParsing) BOOL parsing; 
    
  2. 確保將其初始化:

    - (void)parserDidStartDocument:(NSXMLParser *)parser 
    { 
        self.parsing = YES; 
    } 
    
  3. 如果它遇到intakename不等於TMF1202,您的didStartElement可以清除[R是BOOL價值,也許是這樣的:

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
    { 
        if ([elementName isEqualToString:@"intake"]) 
        { 
         NSString *name = attributeDict[@"name"]; 
         self.parsing = [name isEqualToString:@"TMF1202"]; 
        } 
    
        if (![self isParsing]) return; 
    
        // the rest of your standard parsing routine goes here 
    } 
    
  4. 顯然,foundCharacters還必須檢查是否isParsing

    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
    { 
        if (![self isParsing]) return; 
    
        // the rest of your standard foundCharacters goes here 
    } 
    
  5. 而且didEndElement應(a)僅做標準didEndElement的東西,如果isParsing ;和(b)否則,如果結束了intake重置parsing標誌:

    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
    { 
        if ([self isParsing]) 
        { 
         // do your standard didEndElement stuff here 
        } 
        else if ([elementName isEqualToString:@"intake"]) 
        { 
         // otherwise, if we're ending an `intake`, then go ahead and turn parsing back on 
    
         self.parsing = YES; 
        } 
    } 
    

的細節可能會有所不同(也有很多方法來解決這個),但是這是一種方法。

+3

儘管它已被提到不是說感謝評論,我無法拒絕不這樣說,如此慷慨明確的答案。完成羅布。 – Ben