读取第一个元素后停止XML解析

时间:2011-05-12 17:29:06

标签: xcode nsxmlparser

我想检查XML中的数据版本号,如果XML的版本号比用户当前版本(保存在NSUserDefaults中)更新,则解析XML并将其插入到SQLite存储中,否则解析将停止发生。 我已经找到了解析和存储部分,但我无法弄清楚如何在启动后停止XML解析。

我的XML看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<DBName.sqlite>
  <data version="1">
    <rows>
      <row>
        <someInt>0</someInt>
        <someString>Howdy</someString>
        <rowVersion>0</rowVersion>
      </row>
      ...
    </rows>
  </data>
</DBName.sqlite>

所以我要做的就是在用户以前存储的dataversionCode == XML dataversionCode时停止NSXMLParser。

我的解析方法如下所示:

- (BOOL)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error {

    BOOL result = YES;

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
    [parser setDelegate:nil];

    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];

    NSError *parseError = [parser parserError];
    if (parseError && error) {
        *error = parseError;
        result = NO;
    }

    [parser release];
    return result;
}

感谢任何帮助。 LQ

我找到了一个解决方案,感谢Rob Napier的轻推:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

    if (qName) {
        elementName = qName;
    }

    if ([elementName isEqualToString:@"data"]) {

        int dataVersion = [[attributeDict objectForKey:@"version"] intValue]; 

        // Match dataVersion with whatever desired value

        if (dataVersion <= someValue) {
            [parser abortParsing];
        }

    }

    . . .

}

1 个答案:

答案 0 :(得分:4)

实施委托(无论如何你都需要)。在委托中,当您解析版本不符合要求时,请调用[parser abortParsing]

相关问题