2011-12-27 3 views
0

메신저 NSXMLParserDelegate를 사용하여 XML 구문 분석을하고 있습니다. 라벨 값을 인쇄 할 때 null 값을 얻었습니다 ... XML 파일을 사용하여 간단한 XML 파일을 인터넷에 넣었습니다. 파일이 너무 많습니다. plone 도움말을 확인할 수 있습니다. . 여기 내 코드는IOS의 XML 구문 분석에서 레이블에 NULL 값이 표시됩니까?

#import "xmlViewController.h" 

@implementation xmlViewController 
@synthesize label; 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Release any cached data, images, etc that aren't in use. 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"http://www.bonifacedesigns.com/tuts/xmltest.xml"]]; 
    receivedData=[[NSMutableData alloc]initWithContentsOfURL:url]; 
    dataParser=[[NSXMLParser alloc]initWithData:receivedData]; 
    dataParser.delegate=self; 
    [dataParser parse]; 
} 

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
// if(!xmlString){ 
//   
// }else 
// { 
//  [xmlString setString:@""]; 
// } 
    if([elementName isEqualToString:@"elements"]) 
    { 
     xmlString=[NSMutableString alloc]; 
     [xmlString setString:@""]; 
    } 

} 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    xmlString= (NSMutableString *)[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 

     if([elementName isEqualToString:@"element"]){ 

      NSString *string=xmlString; 
      [xmlArray addObject:string]; 
      label.text=[NSString stringWithFormat:@"%@",xmlArray]; 

     } 

} 

@end 

이것은 내 XML 파일입니다. 그런거 내 label.Help 날이 코드를 편집하고

<elements> 
<element myData="XML Data Parsed!"/> 
</elements> 

확인 지금 확인했다 :

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
// if(!xmlString){ 
//   
// }else 
// { 
//  [xmlString setString:@""]; 
// } 


    if([elementName isEqualToString:@"elements"]) 
    { 

     xmlString=[[NSMutableString alloc]initWithCapacity:5]; 
    } 

} 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    xmlString= (NSMutableString *)[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 

     if([elementName isEqualToString:@"element"]){ 
      [attributeDict objectForKey:@"myData"]; 
      [xmlString setString:@""]; 
      NSString *string=xmlString; 
      [xmlArray addObject:string]; 
      label.text=[NSString stringWithFormat:@"%@",xmlArray]; 

     } 

내가지고있어 오류 :

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with setString:' 
*** First throw call stack: 
(0x13ba052 0x154bd0a 0x1362a78 0x13629e9 0x1387970 0x2a26 0x9e1a35 0x5171532 0x9e002d 0x26b8 0xd764e 0x37a73 0x37ce2 0x37ea8 0x3ed9a 0xfbe6 0x108a6 0x1f743 0x201f8 0x13aa9 0x12a4fa9 0x138e1c5 0x12f3022 0x12f190a 0x12f0db4 0x12f0ccb 0x102a7 0x11a9b 0x2238 0x2195 0x1) 
terminate called throwing an exception 

답변

1

코드에 몇 가지 오류가있는 것으로 보입니다.

변경이 용이 한 문자열 xmlString 제대로 줄에, 초기화되지 않습니다 xmlString = [[NSMutableString alloc] initWithCapacity:X]; :이 같아야합니다

xmlString = [NSMutableString alloc]; // wrong 

.

또한 구문 분석기가 문자를 찾으면 기존 내용에 추가하는 대신 기존의 변경 가능한 문자열 전체를 바꾸거나 코드에 따라 메모리 주소를 비교하고 결과를 낭비하기 때문에 시도합니다 (==).

// wrong 
xmlString == (NSMutableString *)[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

이 같아야합니다 : didEndElement에 마지막으로

[xmlString appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; 

, 나는 당신이 달성하려는 모르겠어요,하지만 당신은 배열에 문자열 객체 참조를 추가 한 다음 설정 배열의 내용을 표시하는 레이블 텍스트 ... 변경 가능한 배열이 잘 할당되고 초기화 된 경우 (실제로 확실하지 않은 경우) 레이블에 적어도 배열 내용이 표시되어야합니다. 그러나 변경 가능한 문자열 ([xmlString setString:@""];)을 "플러시"하고 모든 요소에 할당하지 않을 수도 있습니다.

편집는 :

attributeDict지도는 자신의 값으로 키와 같은 속성 이름. 귀하의 속성 값은 [attributeDict objectForKey:@"myData"];을 통해 액세스 할 수 있습니다.

+0

[xmlString setString : @ ""]; 이 줄을 추가 할 곳 .. 내 코드에 추가했습니다. 정확합니다. –

+0

'didEndElement'에 추가하십시오. 속성을 처리하기 위해 편집을 참조하십시오. –

+0

위의 편집 내용을 확인하고 그와 같은 오류가 발생합니다. –

1

나는 추측

xmlString== (NSMutableString *)[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

C : 문제는이 라인에 한도 == ~ =

희망 사항이 필요하지 않습니다.

+0

죄송합니다. 귀하의 추측은 잘못되었습니다. 어쨌든 그 캐치에 대해 감사드립니다. –

관련 문제