Остановить синтаксический анализ XML после чтения первого элемента - PullRequest
2 голосов
/ 12 мая 2011

Я хочу проверить номер версии данных в моем 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>

Итак, я пытаюсь остановить NSXMLParser, если ранее сохраненный dataversionCode пользователя == dataversionCode XML.

Мой метод разбора выглядит так:

- (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

Я нашел решение, благодаря толчку Роба Нейпира:

- (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 Ответ

4 голосов
/ 12 мая 2011

Реализация делегата (который вам все равно понадобится). В делегате, когда вы анализируете версию, если это не то, что вам нужно, тогда вызывайте [parser abortParsing].

...