iphone - 过滤 XML 解析器数据

标签 iphone ios objective-c xml xml-parsing

我计划开发一个应用程序,以便根据用户输入从文件中检索部分 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 Format

最佳答案

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

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

    @property (nonatomic, getter = isParsing) BOOL parsing;
    
  2. 确保对其进行初始化:

    - (void)parserDidStartDocument:(NSXMLParser *)parser
    {
        self.parsing = YES;
    }
    
  3. 如果遇到name不等于TMF1202intake,你的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
    }
    
  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) 仅在 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/

相关文章:

ios - 沙盒中自动续订订阅 : renewal doesn't come after relaunch of App

ios - 在 CGContext 上绘制的部分透明图像周围放置边框

objective-c - 我可以使用 @synthesized 方法验证 Objective-C 中的 @property 值吗?

objective-c - NSScanner 从 NSString 中删除子字符串引用

iphone - 如何在 ios 4 中以编程方式将图像数组添加到 Imageview?

iphone - 发送 json 对象后应用程序崩溃

iphone - 使用 AVFoundation 捕获视频不会捕获任何音频

ios - 下载每个图像后重新加载 tableview

iphone - +[NSNumber numberWithUnsignedInteger :] Literal?

iphone - 用于视网膜显示的 CoreGraphics