0

彼らが言うように、私は本当に木を通して森を見ることができません。まず、ここに私のコードがあります:

 -(NSMutableArray*)getWaranty:(NSString*)string start:(NSString*)start and:(NSString*)end{
NSMutableArray *waranties = [[NSMutableArray alloc] init];
NSRange startRange = [string rangeOfString:start];
NSRange valueRange;
valueRange.location = startRange.location + startRange.length; //beginpunt
NSRange eindRange = [string rangeOfString:end];
valueRange.length = eindRange.location - valueRange.location;
NSString *result = [[NSString alloc]init];
result = nil;
if(valueRange.location != NSNotFound){
    if(valueRange.length != NSNotFound){
        result = [string substringWithRange:valueRange];
        NSString *testResult = [[NSString alloc]init];
        testResult = result;

        NSString* beginTrim = [[NSString alloc]init];
        NSString* beginTrim1 = [[NSString alloc]init];
        NSString* beginTrim2 = [[NSString alloc]init];
        NSString* beginTrim3 = [[NSString alloc]init];
        NSString* beginTrim4 = [[NSString alloc]init];
        NSString* beginTrim5 = [[NSString alloc]init];
        NSString* beginTrim6 = [[NSString alloc]init];
        NSString* beginTrim7 = [[NSString alloc]init];
        NSString* beginTrim8 = [[NSString alloc]init];
        NSString* beginTrim9 = [[NSString alloc]init];
        NSString* beginTrim10 = [[NSString alloc]init];
        beginTrim = [testResult stringByReplacingOccurrencesOfString:@"<li class=\"TopTwoWarrantyListItem\">"withString:@""];
        beginTrim1 = [beginTrim stringByReplacingOccurrencesOfString:@"<b>"withString:@""];
        beginTrim2 = [beginTrim1 stringByReplacingOccurrencesOfString:@"<li>"withString:@""];
        beginTrim3 = [beginTrim2 stringByReplacingOccurrencesOfString:@"</li>"withString:@""];
        beginTrim4 = [beginTrim3 stringByReplacingOccurrencesOfString:@"</b>"withString:@""];
        beginTrim5 = [beginTrim4 stringByReplacingOccurrencesOfString:@"<a href=\"javascript:SelectTabFromLink(5);\" id=\"SeeWarrantyTab\" class=\"uif_link\">"withString:@""];
        beginTrim6 = [beginTrim5 stringByReplacingOccurrencesOfString:@"</a>"withString:@""];
        NSString *lang =[[NSString alloc]init];
        lang= @"nl";
        if(lang == @"nl"){
            beginTrim7 = [beginTrim6 stringByReplacingOccurrencesOfString:@".  Raadpleeg het tabblad Garantie voor meer informatie."withString:@""];
        }
        beginTrim8 = [beginTrim7 stringByReplacingOccurrencesOfString:@"</div>"withString:@""];
        beginTrim9 = [beginTrim8 stringByReplacingOccurrencesOfString:@"\r\n"withString:@""];
        beginTrim10 = [beginTrim9 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        NSString *warant = [[NSString alloc]init];
        NSString *theWarant = [[NSString alloc]init];
        NSString *hoev = [[NSString alloc]init];
        NSString *lic = [[NSString alloc]init];
        NSString *datum = [[NSString alloc]init];
        if(lang == @"nl"){
            //split met garantie
            warant = [beginTrim10 stringByReplacingOccurrencesOfString:@"  garantie met einddatum op"withString:@""];
            NSArray *array = [[NSArray alloc]init];
            array = [warant componentsSeparatedByString:@"                                                                                                                 "];
            NSInteger hoeveel = [array count];
            if(hoeveel != 0){
                hoev = [NSString stringWithFormat:@"%d",hoeveel];
                [waranties addObject:hoev];
                for(int i = 0; i < hoeveel; i++){
                    if([array objectAtIndex:i] != NULL){
                        theWarant = [array objectAtIndex:i];
                        NSArray *specArray = [[NSArray alloc]init];
                        specArray = [theWarant componentsSeparatedByString:@"  "];
                        lic = [specArray objectAtIndex:0];
                        datum = [specArray objectAtIndex:1];
                        [waranties addObject:lic];
                        [waranties addObject:datum];
                        NSLog(@" de waraiens 1 :%@", [waranties objectAtIndex:0]);
                        NSLog(@" de waraiens 1 :%@", [waranties objectAtIndex:1]);
                    }
                    else{

                    }

                }
            NSLog(@" de waraiens 1 :%@", [waranties objectAtIndex:0]);
            NSLog(@" de waraiens 2 :%@", [waranties objectAtIndex:1]);
            NSLog(@" de waraiens 3 :%@", [waranties objectAtIndex:2]);
            NSLog(@" de waraiens 4 :%@", [waranties objectAtIndex:3]);
            NSLog(@" de waraiens 5 :%@", [waranties objectAtIndex:4]);
            return waranties;
            }
        }
    }
}

}

コードは次のようなものを返す必要があります。

2013-03-12 21:12:51.783 DellSupportApp[6254:c07] de waraiens 1:2

2013-03-12 21:12:51.785 DellSupportApp[6254:c07] de waraiens 2: デル ビジネス サポート/プロサポート

2013-03-12 21:12:51.785 DellSupportApp[6254:c07] de waraiens 3 :30/07/2009

2013-03-12 21:12:51.785 DellSupportApp[6254:c07] de waraiens 4:翌営業日

2013-03-12 21:12:51.786 DellSupportApp[6254:c07] de waraiens 5 :30/07/2009

しかし、トリッキーなのは. 10回に1回しか機能しません...メソッドはこの関数で呼び出されます:

-(NSMutableArray*) parseIt: (NSString*) toPars {
NSMutableArray *waranties = [[NSMutableArray alloc]init];
NSString *beginTitle = @"<title>";
NSString *eindTitle = @"</title>";
NSString *title = [self getTitle:toPars start:beginTitle and:eindTitle];
if(title != NULL){
    NSLog(@"de title = %@", title);
    [waranties addObject:title];
    NSString *try = [waranties objectAtIndex:0];
    NSLog(@"de title = %@", try);
}

NSString *beginWar = @"<div class=\"TopTwoWarrantySummaryDiv\">";
NSString *eindWar = @"<div class=\"RequestWarrantyExtensionDiv\">";
NSMutableArray *warrant = [[NSMutableArray alloc]init];
warrant = [self getWaranty:toPars start:beginWar and:eindWar];
if(warrant != NULL){
    [waranties addObject:warrant];
     NSLog(@" de warant %@ ", [waranties objectAtIndex:1]);
}
return waranties;

ここに示されている最初の方法に約10回入るのは非常に厄介だと思いますが、私は一度だけ尋ねます...私は今4時間以上問題を探しており、いくつかのエラーにうんざりしていますが、実際にはエラーがほとんどです表示されていません...

私の間違いを指摘してください...

4

2 に答える 2

1

あなたのコードを見ると、それがどれほどもろいのか心配です。保証を区切る一連のスペースを探していますが、それは本当にデータを分割するための最良の方法ですか?

それに加えて、あなたはそれらの分割について仮定を立てています。例えば:

specArray = [theWarant componentsSeparatedByString:@"  "];

が割り当てられ、インデックス0と1の両方をチェックしますが、配列に2つの値があることを確認しないでください。

NSLog下部のsも、処理される前に配列の境界をチェックしません。

スペースは、データの区切り文字として悪名高いものになります。あなたがhtmlを解析することを探しているなら、仕事をより良くするかもしれないツールがそこにあります。

于 2013-03-12T20:29:20.243 に答える
0

このステートメントは、warantiesが実行前に空の配列である場合、範囲外で失敗します。

if(warrant != NULL){
    [waranties addObject:warrant];
     NSLog(@" de warant %@ ", [waranties objectAtIndex:1]);
}

配列の最初のオブジェクトのインデックスは1ではなく0です。

そして、それはタイトルが見つからないときはいつでも起こります。タイトルが常にある場合、これは問題ではない可能性があります。ただし、コードの節約になります。

if(warrant != NULL){
    [waranties addObject:warrant];
     NSLog(@" de warant %@ ", [waranties objectAtIndex:[caranties count]-1]);
}

またはprobalbyさらに良い:

if(warrant != NULL){
    [waranties addObject:warrant];
     NSLog(@" de warant %@ ", [waranties lastObject]);
}

とにかく、これはデバッグ出力のみであるため、問題の根本的な原因ではありません。フォーマット機能があるため、コメントではなく回答を選択しました。

于 2013-03-12T20:29:32.057 に答える