2011-01-28 4 views
0

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

-[NSXMLElement length]: unrecognized selector sent to instance 0x280da30

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

Если я удаляю цикл и hardcode строку (я не хочу, это просто тест), код ниже работает. (За исключением перечисления конечно)

Он никогда не получает, насколько называя 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]; 
+0

Это может помочь узнать, как выглядит вход ... – jlehr

+0

Кстати, код сканирования отлично работает для простых входов. – jlehr

+0

Я уже говорил, что он отлично работает для простых входов. – Pripyat

ответ

4

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

The nodesForXPath:error: method returns an array of NSXMLNode objects

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

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


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

Возможно, вам понадобится повторить или пропустить теги и соответствующим образом интерпретировать их содержимое.

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

+0

как я могу преобразовать его в строку? – Pripyat

1

Вы уверены, что ваш 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:

+0

Это NSStrings. Я объяснил, почему он вызывает 'NSXMLElement' в журнале - его вывод мусора, это произошло несколько раз. По мере того как цикл перемещается, кажется, что строка, которую он должен искать, очищается ... – Pripyat

+0

Я с Полом, по всей вероятности, некоторые элементы в массиве не являются экземплярами NSString. Как вы создаете массив? (Код был бы полезен). – jlehr

+0

Это строки. Я редактировал сообщение, чтобы показать, как я создаю массив. – Pripyat

 Смежные вопросы

  • Нет связанных вопросов^_^