2012-07-16 1 views
1

xml 파일을 구문 분석 할 때 콘솔에서 구문 분석 된 데이터 (예 : Speller의 처리 값 ...)를 표시하지만 추가되지는 않습니다. msmutablearray 사용자. 여기에 몇 가지 코드가 있습니다. 문제가 어디에 있습니까? 도와주세요 :구문 분석은 작동하지만 데이터는 nsMutableArray에 저장되지 않습니다.

- (MyData *) initXMLParser { 
    [super init]; 
    // init array of user objects 
    users = [[NSMutableArray alloc] init]; 
    return self; 
} 


- (void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict 
{ 

    if ([elementName isEqualToString:@"user"]) { 
     NSLog(@"user element found – create a new instance of User class..."); 
     user = [[User alloc] init]; 

    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (!currentElementValue) { 
     // init the ad hoc string with the value  
     currentElementValue = [[NSMutableString alloc] initWithString:string]; 
    } else { 
     // append value to the ad hoc string  
     [currentElementValue appendString:string]; 
    } 
    NSLog(@"Processing value for : %@", string); 
} 

- (void)parser:(NSXMLParser *)parser 
didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
{ 

    if ([elementName isEqualToString:@"users"]) { 
     // We reached the end of the XML document 
     return; 
    } 

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

     if ([elementName isEqualToString:@"userName"]) { 
       [[self user] setUserName:currentElementValue]; 

      } 
      if ([elementName isEqualToString:@"firstName"]) { 
       [[self user] setFirstName:currentElementValue]; 

      } 

      if ([elementName isEqualToString:@"lastName"]) { 
       [[self user] setLastName:currentElementValue]; 

      } 

     [users addObject:user]; 
     /*comboarray = [[users arrayForKey:@"ComboBoxValues"] 
         sortedArrayUsingSelector:@selector(compare:)];*/ 

     // release user object 
     [user release]; 
     user = nil; 

    } else { 

     [user setValue:currentElementValue forKey:elementName]; 
      } 

    [currentElementValue release]; 
    currentElementValue = nil; 
} 
-(BOOL)parseDocumentWithData:(NSData *)data { 
    //NSString * filePath = [[NSBundle mainBundle] pathForResource:@"Users" ofType:@"xml"]; 
    //data = [NSData dataWithContentsOfFile:filePath]; 

    if (data == nil) 
     return NO; 

    // this is the parsing machine 
    NSXMLParser *xmlparser = [[NSXMLParser alloc] initWithData:data]; 

    // this class will handle the events 
    [xmlparser setDelegate:self]; 
    [xmlparser setShouldResolveExternalEntities:NO]; 

    // now parse the document 
    BOOL ok = [xmlparser parse]; 
    if (ok == NO) 
     NSLog(@"error"); 
    else 
     NSLog(@"OK"); 

    [xmlparser release]; 
    return ok; 
} 


- (void) dealloc { 

    [currentElementValue release]; 
    [super dealloc]; 
} 

답변

0

이 코드의 문제 일부가 될 것으로 보인다

- (MyData *) initXMLParser { 
    [super init]; // change to self = [super init]; 
    // init array of user objects 
    users = [[NSMutableArray alloc] init]; 
    return self; 
} 

당신은 [super init];

의 값으로 self을 초기화 그리고 당신의 dealloc 전화에 [users release]; 줄을 추가되지 않는 한 당신은 다른 곳에 그것을 놓는다.

+0

감사합니다. 그럼이 방법을 삭제해야합니까? – Wael

+0

몇 가지 코드를 변경하려면? – Wael

+0

나는 그것을했지만 여전히 데이터를 저장하지 않았다 : ( – Wael

0

didEndElement 메소드를 다음과 같이 바꾼다 :

- (void)parser:(NSXMLParser *)parser 
didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName { 

     if ([elementName isEqualToString:@"users"]) { 
      // We reached the end of the XML document 
      return; 
     } 
     if ([elementName isEqualToString:@"userName"]) { 
      [[self user] setUserName:currentElementValue]; 
      [currentElementValue release]; 
      currentElementValue = nil; 
     } 
     if ([elementName isEqualToString:@"firstName"]) { 
      [[self user] setFirstName:currentElementValue]; 
      [currentElementValue release]; 
      currentElementValue = nil; 
     } 

     if ([elementName isEqualToString:@"lastName"]) { 
      [[self user] setLastName:currentElementValue]; 
      [currentElementValue release]; 
      currentElementValue = nil; 
     } 

     if ([elementName isEqualToString:@"user"]) { 
      [users addObject:user]; 
      /*comboarray = [[users arrayForKey:@"ComboBoxValues"] 
        sortedArrayUsingSelector:@selector(compare:)];*/ 

      // release user object 
      [user release]; 
      user = nil; 
     } 
    } 
+0

고마워,하지만 여전히 작동하지 않습니다 – Wael