过滤XML分析器数据

时间:2013-08-01 16:16:22

标签: iphone ios objective-c xml xml-parsing

我计划开发一个应用程序,以便根据用户输入从文件中检索部分xml数据。我的代码适用于检索xml文件的内容,但我无法找出最好的方法让解析器给我所有内部的元素(例如,入口名称=“TMF1202”)...用户将将摄入名称作为输入,解析器将检索仅存在于该摄入标记中的元素,这是我的解析器代码:

#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

1 个答案:

答案 0 :(得分:3)

假设您希望此解析器像它一样工作,但只是不解析我们的XML文档中intakename属性不等于{{1}的元素的任何元素(或子元素)你可以使用一个TMF1202标志来指示你是否应该解析树的这个分支。例如。一种方法可能是:

  1. 创建一个BOOL属性,指定您当前是否正在解析:

    BOOL
  2. 确保初始化它:

    @property (nonatomic, getter = isParsing) BOOL parsing;
    
  3. 如果遇到- (void)parserDidStartDocument:(NSXMLParser *)parser { self.parsing = YES; } intake不等于name的{​​{1}},您的TMF1202可以清除didStartElement值,或许类似于:

    BOOL
  4. 显然,- (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 } 还必须检查是否foundCharacters

    isParsing
  5. 而且-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if (![self isParsing]) return; // the rest of your standard foundCharacters goes here } 应该(a)只在didEndElement时执行标准didEndElement内容。 (b)否则,如果结束isParsing重置intake标志:

    parsing
  6. 细节可能有所不同(有很多方法可以解决这个问题),但这是一种方法。