2013-08-01 2 views
0

Я планирую разработать приложение для извлечения части данных xml из файла на основе ввода пользователем. Мои коды хорошо работают для извлечения содержимого xml-файла, но я не могу найти лучший способ попросить парсер дать мне все элементы, которые находятся внутри, например, (enter name = «TMF1202») ... Пользователь будет дать всасываемого имя в качестве входных данных и парсер будет извлекать элементы, которые существуют только в этом впускном теге Вот мой Parser код:Фильтрация данных анализатора 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. Если он встречает intake, чье name не равно TMF1202, ваш didStartElement может clea г, что 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 должен (а) сделать только стандартный didEndElement материал, если isParsing ; и (б) в противном случае, если окончание 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

Смежные вопросы