2011-01-28 5 views
0

NSScannerを使用しようとしていますが、NSArray列挙ループです。しかし、これは失敗します。いいえ、私はどこでもlengthを呼び出していないですNSScanner&Array Loops

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

。スキャナが完了する前に見つかった値が変更されたため、空白になり、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

+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

あなたはあなたのarrNSStringオブジェクトが含まれていることを確認していますか? 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

NSStringです。私はログ内でなぜNSXMLElementを呼び出すのかを説明しました。その出力はごみですが、数回起こりました。ループが進むにつれて、検索するはずの文字列がクリアされているようです。 – Pripyat

+0

私はPaulと一緒ですが、配列内の項目のいくつかはNSStringのインスタンスではありません。どのように配列を作成していますか? (コードは役に立ちます)。 – jlehr

+0

これは文字列です。私は投稿を編集して、配列の作成方法を示しました。 – Pripyat