NSScanner & Array Loops - PullRequest
       8

NSScanner & Array Loops

0 голосов
/ 28 января 2011

Я пытаюсь использовать NSScanner - это цикл перечисления NSArray. Это однако терпит неудачу:

- [Длина NSXMLElement]: нераспознанный селектор отправлен на экземпляр 0x280da30

Нет, я нигде не звоню length. Похоже, что значение найденного изменяется до завершения работы сканера, что делает его пустым, вызывая ошибку length.

Если я удаляю цикл и жестко кодирую строку (я не хочу этого, это всего лишь тест), код ниже работает. (исключая перечисление конечно)

Это никогда не дойдет до вызова NSLog s ...

Вот мой код:

    for (NSString*found in arr)
    {
        NSLog(@"Found %@",found);

        NSString*search = [NSString stringWithString:found];

        NSString *separatorString = @"\"";                             
        NSString *container = nil;
        NSScanner *aScanner = [NSScanner scannerWithString:search]; 

        [aScanner setScanLocation:0];                                        
        [aScanner scanUpToString:@"src=\"" intoString:nil];          
        [aScanner scanString:@"src=\"" intoString:nil];                     
        [aScanner scanUpToString:separatorString intoString:&container]; 

        NSLog(@"scanned");

        NSLog(@"%@",container);

        NSImage*previewImage = [[NSImage alloc] initWithContentsOfFile:[relativeDir stringByAppendingPathComponent:container]];

        [preview setImage:previewImage];

        [previewImage release];

        progressed = progressed + 1;

        [convertProgress setDoubleValue:[convertProgress doubleValue] + progressed];
    }

Как мне заставить это работать?

Edit:

Вот входные данные:

    NSXMLDocument*doc = [[NSXMLDocument alloc] initWithData:[NSData dataWithContentsOfFile:webPath] options:NSXMLDocumentTidyHTML error:nil];

    NSArray*arr = [doc nodesForXPath:@"//img[@src]" error:nil];

Ответы [ 2 ]

4 голосов
/ 28 января 2011

Из документации:

Метод nodesForXPath:error: возвращает массив объектов NSXMLNode

Ваш массив не полон строк . Он полон различных NSXML* объектов. Они не мусор. Именно так и должно работать.

Возможно, вы не звоните length, но stringWithString:, вероятно, вызывает length, чтобы выяснить, сколько места нужно выделить в новой строке.

<Ч />

Преобразование в строку может многое значить. Узел XML может быть отдельным тегом, это может быть встроенный CDATA, это может быть тег с различными атрибутами. Кроме того, XML-документ очень структурирован. Редко имеет смысл просматривать содержимое документа как прямое перечисление тегов / содержимого без применения некоторого структурного значения.

Скорее всего, вам понадобится просмотреть или иным образом пройтись по тегам и правильно интерпретировать их содержимое.

Первым шагом было бы удалить все, кроме первоначального NSLog () и посмотреть, что у вас получилось. Затем выясните, как пройтись по дереву узлов. Затем выясните, как их правильно проанализировать.

1 голос
/ 28 января 2011

Вы уверены, что ваш arr содержит NSString объектов?Тот факт, что NSXMLElement выдает ошибку, кажется мне подозрительным.

Редактировать

Да, похоже, что документы говорят, что массив из nodesForXPathсодержит NSString объектов, но NSXMLElement объектов.

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSXMLNode_Class/Reference/Reference.html#//apple_ref/occ/instm/NSXMLNode/nodesForXPath:error:

...