2014-01-22 4 views
0

XML 문서에서 데이터를 검색하고 다차원 NSMutableArray에 저장하려고합니다. 문제는 그 자체가 덮어 쓰는 것 같습니다.NSMutableArray 다차원 덮어 쓰기 자체

ViewDidLoad 메서드에서 배열 cols 및 행을 선언했습니다. 같은 :

rows = [[NSMutableArray alloc] init]; 
cols = [[NSMutableArray alloc] init]; 

는 XML 구문 분석 방법은 다음과 같다 : 이것은 내 XML의 문서는

- (void)parser:(NSXMLParser *)parser 
    didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict 
{ 
    if ([elementName isEqualToString:@"song"]) { 

     title = [attributeDict valueForKey:@"title"]; 
     songId = [attributeDict valueForKey:@"id"]; 
     singer = [attributeDict valueForKey:@"author"]; 
     theDuration = [attributeDict valueForKey:@"duration"]; 
     theLink = [attributeDict valueForKey:@"link"]; 

     [cols addObject: title]; 
     [cols addObject: songId]; 
     [cols addObject: singer]; 
     [cols addObject: theDuration]; 
     [cols addObject: theLink]; 

     [rows addObject: cols]; 
    } 
} 

입니다. 당신이 볼 수 있듯이 처음 2 곡의 id는 0이고 1과 2의 다음 2는 2입니다. 배열은 id로 6 개의 모든 don 객체에 0을 넣는 것처럼 보입니다.

<?xml version="1.0"?> 
<Lists> 
<playlist title="Quo Vadis" id="0"/> 
    <song title="One Perfect Day" link="m01MYOpbdIk" duration="3:15" author="Rune RK" id="0" /> 
    <song title="two Perfect Day" link="m01MYOpbdIk" duration="3:15" author="Rune RK" id="0" /> 

<playlist title="Lord of the Rings" id="1"/> 
    <song title="three Perfect Day" link="m01MYOpbdIk" duration="3:15" author="Rune RK" id="1" /> 
    <song title="fourth Perfect Day" link="m01MYOpbdIk" duration="3:15" author="Rune RK" id="1" /> 
<playlist title="Face" id="2"/> 
    <song title="five Perfect Day" link="m01MYOpbdIk" duration="3:15" author="Rune RK" id="2" /> 
    <song title="six Perfect Day" link="m01MYOpbdIk" duration="3:15" author="Rune RK" id="2" /> 
</Lists> 

나는 그것을를 출력하려면이 옵션을 사용하고 있습니다 :

NSLog(@"%@", [[rows objectAtIndex:3] objectAtIndex:1 ]); 
+0

결과를 표시 할 수 있습니까? –

+0

행과 열을 어떻게 선언했는지 보여줄 수 있습니까 – Tony

+2

'objectForKey :'는 사전에서 값을 검색하는 전용 메소드입니다. 'value-key :'는 "Key-Value Coding"마술이 필요한 경우에 사용됩니다. –

답변

2

당신은 모든 행에 대해 동일한 cols 인스턴스를 재사용 할 것으로 보인다. 너는 그렇게 할 수 없다. 각 행에 대해 새로운 cols 인스턴스를 생성해야합니다

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    if ([elementName isEqualToString:@"song"]) { 
     title = attributeDict[@"title"]; 
     songId = attributeDict[@"id"]; 
     singer = attributeDict[@"author"]; 
     theDuration = attributeDict[@"duration"]; 
     theLink = attributeDict[@"link"]; 

     NSArray *cols = @[ title, songId, singer, theDuration, theLink ]; 

     [rows addObject: cols]; 
    } 
} 

cols 바르를 제거합니다. 이 업데이트에는 필요하지 않습니다.

또한 KVC를 사용한다는 의미가 아니라면 사전에 valueForKey:을 사용하지 마십시오. objectForKey:을 사용하거나 여기에서했던 것처럼 새로운 현대 구문을 사용하십시오.

0

이것은 일종의 스핀 오프 rmaddy 님의 (훌륭한) 답변입니다. 리터럴 배열을 사용할 때 - 예 : @[thing1, thing2] - 문제가있을 경우 nil 일 수 있습니다. 배열을 작성하기 전에이를 확인하는 것이 좋습니다. 이 nil을의 경우는 nil 않은 경우 dict[@"key"]thing1을 설정

thing1 = dict[@"key"] ? dict[@"key"] : @""; 

, 그리고 빈 문자열 :는 C의 삼중 연산자는이 작업을 수행 할 수있는 좋은 방법입니다. 내가 청소기를 찾을 수 있기 때문에 나는 또한 지역 변수 cols를 추가 건너

- (void)parser:(NSXMLParser *)parser 
    didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attrs 
{ 
    // presumably other code ... 
    if ([elementName isEqualToString:@"song"]) { 
     title = attrs[@"title"] :? @""; 
     songId = attrs[@"id"] :? @""; 
     singer = attrs[@"author"] :? @""; 
     theDuration = attrs[@"duration"] :? @""; 
     theLink = attrs[@"link"] :? @""; 

     [rows addObject:@[ title, songId, singer, theDuration, theLink ]]; 
    } 
} 

: 속기 (더 효율적인)에서 :

thing1 = dict[@"key"] ?: @""; 

코드에서이 사용하고, 가정이 변수는 모든 문자열 , 리터럴 배열을 직접 추가하십시오.