我计划开发一个应用程序,以便根据用户输入从文件中检索部分 xml 数据。我的代码可以很好地检索 xml 文件的内容,但我无法找出让解析器给我所有内部元素的最佳方法,例如 (intake name="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 文档中的任何元素(或子元素),这些元素是 intake
元素,其 name
属性是不等于 TMF1202
,您可以使用一个 BOOL
标志来指示您是否应该解析树的这个分支。例如。一种方法可能是:
创建一个
BOOL
属性来指定您当前是否正在解析:@property (nonatomic, getter = isParsing) BOOL parsing;
确保对其进行初始化:
- (void)parserDidStartDocument:(NSXMLParser *)parser { self.parsing = YES; }
如果遇到
name
不等于TMF1202
的intake
,你的didStartElement
可以清除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 }
显然,
foundCharacters
还必须检查isParsing
是否:-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if (![self isParsing]) return; // the rest of your standard foundCharacters goes here }
didEndElement
应该 (a) 仅在isParsing
时执行标准的didEndElement
操作; (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; } }
细节可能会有所不同(并且有很多方法可以解决这个问题),但这是一种方法。
关于iphone - 过滤 XML 解析器数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17999333/