iPhone - NSScanner не анализирует

Я использую этот метод, чтобы найти первую пару ‹> в строке (содержимое XML):

NSScanner* scanner = [NSScanner scannerWithString:contentToParse];
int startPos = 0;
int endPos = 0;

// Open search
if ([scanner scanString:@"<" intoString:nil]) {
    startPos = [scanner scanLocation]-1;
    NSLog(@"found '<' at pos %i", startPos);

    // close search
    if ([scanner scanString:@">" intoString:nil]) {
        endPos = [scanner scanLocation]-1;
        NSLog(@"found '>' at pos %i", endPos);

        NSString* tag = [contentToParse substringWithRange:NSMakeRange(startPos, endPos-startPos)];
        NSLog(@"Tag found : %@", tag);
    }
}

но регистрируется только «найдено '‹' в позиции 0». Мой XML-контент содержит много-много элементов ‹>...

Почему этот метод не работает?


person Oliver    schedule 12.06.2011    source источник


Ответы (1)


scanString:intoString: пытается просканировать строковый параметр в текущем местоположении. Если такой строки нет в текущем местоположении, она просто возвращает NO.

Вы можете использовать scanUpToString:intoString: (reference), который сканирует продвижение вперед до тех пор, пока не встретится заданная строка.

NSScanner *scanner = [NSScanner scannerWithString:contentToParse];
// open search
[scanner scanUpToString:@"<" intoString:nil];
if (![scanner isAtEnd]) {
    [scanner scanString:@"<" intoString:nil];
    // close search
    NSString *tag = nil;
    [scanner scanUpToString:@">" intoString:&tag];
    if (![scanner isAtEnd]) {
        NSLog(@"Tag found : %@", tag);
    }
}
person albertamg    schedule 12.06.2011
comment
Спасибо. Но почему `[сканер scanUpToString:@‹ intoString:nil]; if (true) ..............` работает (все журналы в порядке) и почему | if ([scanner scanUpToString:@‹ intoString:nil]) .............. нет (ни единого фрагмента входа в консоль) ? - person Oliver; 12.06.2011
comment
[scanner scanUpToString:@"<" intoString:nil]возвращает НЕТ... странно ? Я не менял символы для пропуска... СОВЕТ: у меня есть символ ‹ в начале файла. Будет ли это причиной??? - person Oliver; 12.06.2011
comment
@Oliver scanUpToString:intoString: возвращает YES если сканер сканирует любые символы. Если у вас есть символ ‹ в начале, он возвращает NO. Вы не хотите использовать возвращаемое значение этого метода, чтобы проверить, нашел ли он строку или нет. Используйте ![scanner isAtEnd] как в моем примере. - person albertamg; 12.06.2011