2011-06-12 3 views
0

을 구문 분석하지 않습니다 내가 문자열에 첫 번째 <> 커플을 찾기 위해이 방법을 사용하고 있습니다 (XML 내용) :아이폰 - NSScanner

NSScanner* scanner = [NSScanner scannerWithString:contentToParse]; 
int startPos = 0; 
int endPos = 0; 

// Open search 
if ([scanner scanString:@"<" intoString:nil]) { 
    startPos = [scanner scanLocation]-1; 
    NSLog(@"found '<' at pos %i", startPos); 

    // close search 
    if ([scanner scanString:@">" intoString:nil]) { 
     endPos = [scanner scanLocation]-1; 
     NSLog(@"found '>' at pos %i", endPos); 

     NSString* tag = [contentToParse substringWithRange:NSMakeRange(startPos, endPos-startPos)]; 
     NSLog(@"Tag found : %@", tag); 
    } 
} 

하지만 "POS 0 '<을'발견"이 기록된다 . 내 XML 콘텐츠에 많은 수의 <이 포함되어 있습니다 ...

왜 그 방법이 작동하지 않습니까?

답변

3

scanString:intoString:은 현재 위치에서 문자열 매개 변수를 검색하려고 시도합니다. 해당 문자열이 현재 위치에 없으면 단순히 NO을 반환합니다.

대신 scanUpToString:intoString: (reference)을 사용하면 원하는 문자열이 나올 때까지 스캔 위치를 앞당길 수 있습니다.

NSScanner *scanner = [NSScanner scannerWithString:contentToParse]; 
// open search 
[scanner scanUpToString:@"<" intoString:nil]; 
if (![scanner isAtEnd]) { 
    [scanner scanString:@"<" intoString:nil]; 
    // close search 
    NSString *tag = nil; 
    [scanner scanUpToString:@">" intoString:&tag]; 
    if (![scanner isAtEnd]) { 
     NSLog(@"Tag found : %@", tag); 
    } 
} 
+0

감사합니다. 하지만 왜'[scanner scanUpToString : @ "<"intoString : nil]; if (true) ..............'작동합니다 (로그가 정상입니다) 그리고 왜 | if ([scanner scanUpToString : @ "<"intoString : nil>) ............ (콘솔에 단일 로그가 아닙니다)? – Oliver

+0

'[scanner scanUpToString : @ "<"intoString : nil]'이상한 결과를 반환합니까? 나는 문자를 변경하지 않았습니다. 알아 두겠습니다. 팁 : 파일 시작 부분에 가 있습니다. 그 이유가 되겠습니까 ??? – Oliver

+1

@Oliver'scanUpToString : intoString :''YES '를 반환합니다 ** ** 스캐너가 문자를 스캔하면 **. 처음에 "<"문자가 있으면 '아니오'를 반환합니다. 이 메서드의 반환 값을 사용하여 문자열을 찾았는지 여부를 확인하지 않으려합니다. 예제와 같이'! [scanner isAtEnd] '를 사용하십시오. – albertamg