2011-01-28 87 views
0

我想使用NSScanner是一個NSArray枚舉循環。然而,這種失敗:NSScanner&數組循環

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

不,我不是要求length任何地方。在掃描器完成之前,似乎發現的值已更改,因此使其成爲空白,導致出現length錯誤。

如果我刪除循環並硬編碼字符串(我不想這,它只是一個測試)下面的代碼工作。 (不含當然枚舉)

它從來沒有得到儘可能調用NSLog小號要麼...

這裏是我的代碼:

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]; 
    } 

我怎樣才能得到這個工作?

編輯:

這裏的輸入:

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

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

這可能有助於瞭解輸入是什麼樣的... – jlehr 2011-01-28 18:31:13

+0

順便說一句,掃描代碼適用於簡單的輸入。 – jlehr 2011-01-28 18:32:20

+0

我已經說過它對於簡單輸入工作正常。 – Pripyat 2011-01-28 18:32:58

回答

4

從文檔:

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

你的陣列是不是滿弦的。它充滿了各種各樣的NSXML*對象。他們不是垃圾。這正是它應該如何工作。

您可能不會打電話length,但stringWithString:可能調用length來確定在新字符串中分配多少空間。


轉換爲字符串可能意味着很多事情。一個XML節點可能是一個獨立標籤,它可能是一些內聯CDATA,它可能是一個具有各種屬性的標籤。同樣,一個XML文檔是高度結構化的。作爲對標籤/內容的直接枚舉而不應用某些結構性含義的數量來瀏覽文檔的內容是很有意義的。

您可能需要遞歸或以其他方式行使標籤並適當解釋其內容。

第一步是刪除除了最初的NSLog()之外的所有內容,然後看看你得到了什麼。然後找出如何走節點樹。然後弄清楚如何適當地解析他們。