2011-10-10 4 views
0

현재 일부 xml 데이터를 NSDictionary으로 구문 분석하려고합니다. 내가 사용하고xml을 NSMutableDictionary로 구문 분석

<Rows> 
<Row ID="76" MANF="JARD" ISMANUF="F" ISSER="F"/> 
<Row ID="38" MANF ="SANBIN" ISMANUF ="F" ISSER ="T"/> 
<Rows> 

-이

우선 내가 이렇게 약 보이는 일부 XML을 구문 분석하고, 나는 이런 식으로 뭔가를 시도하고 내가 뭐하는 거지의 조금 확실치 것은 이번이 처음이다 NSXMLParser 그래서 NSLog

NSLog(@"attributes: %@", attributeDict); 

parser:didStartElement:namespaceURI:qualifiedName:attributes:에 위임 방법을 사용하여 대표단, 내 출력은 다음과 같습니다.

} 
2011-10-11 08:01:15.472 Code[526:207] attributes: { 
    ISMANUF = F; 
    ISSER = T; 
    MANF = smart; 
    ID = 74; 
} 
2011-10-11 08:01:15.472 Code[526:207] attributes: { 
    ISMANUF = F; 
    ISSER = T; 
    MANF = "weather guard"; 
    ID = 71; 
} 

내가 지금 NSMutableDictionary에이 물건을 구문 분석을 찾고 있지만, 이것에 대해 이동하는 방법에 대한 toatly 확실하지 오전입니다 ... 나는 내 질문이 될이

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict { 
if ([elementName isEqualToString:@"row"]) { 
     myDic = [[myDic alloc] init]; 
     myDic.isManuf = [attributeDict objectForKey:@"ISMANUF"]; 
     myDic.isSer = [attributeDict valueForKey:@"ISSER"]; 
     myDic.Manf = [attributeDict valueForKey:@"MANF"] 
     myDic.id = [attributeDict valueForKey:@"ID"] 
     } 
} 

처럼 뭔가를 찾고 있어요 복용량이 보이십니까? 헤더 파일에이 변경 가능한 사전을 어떻게 선언합니까? .isManuf .isSer .Manf .id for this NSMutableDictionary

+0

NSMutableDictionary와 함께 작동 시키려면 메서드에서 qualifiedName 변수를 사용할 수 있습니까? –

답변

1

NSObjectNSMutableDictionary의 하위 클래스를 구별해야합니다.

당신이 작성한대로, 그것은 일부 속성을 가진 객체로 간주됩니다. 만약 youre XML rows 항상 동일한 필드가 들어, 나는 이것이 최선의 방법이라고 생각합니다. 객체의 속성은 자동으로 "변경 가능"하므로이면에서 걱정할 사항은 없습니다.

맞춤법이 틀린 키의 오류 확률이 적기 때문에 사용자 지정 개체를 사용하는 것이 더 좋으며 코드는 일반적으로 더 읽기 쉽습니다.

MyDic.h :

@interface MyDic : NSObject { 
    BOOL isManuf; 
    BOOL isSer; 
    NSString *manf; 
    NSUInteger id; 
} 

@property (nonatomic, assign) BOOL isManuf; 
@property (nonatomic, assign) BOOL isSer; 
@property (nonatomic, retain) NSString *manf; 
@property (nonatomic, assign) NSUInteger id; 

@end 

MyDic.m

@implementation MyDic 
@synthetize isManuf, isSer, manf, id; 

-(void)dealloc { 
    [manf release]; 
    [super dealloc]; 
} 
@end 

그리고 정의를 가져올 것을 잊지 마세요

그래서 당신은 여전히 ​​개체를 선언하는 방법을 knwo 필요 개체를 만들 때 기본 클래스의 클래스 이름 (자본 초기)을 사용하십시오.

#import "MyDic.h" 
.... 
myDic = [[MyDic alloc] init]; 
... 
+0

내가이 경로를 따라 가면 나중에 데이터베이스 버전 등으로 데이터베이스가 업데이트 될 때까지 내 개체를 캐시 할 수 있습니까? –

+0

괜찮 았던 것 뿐이므로 작동하지 않을 것입니다. NSXMLParsing 대리자는 문자열을 다시 발생시킵니다. 여기에서 어디로 가야할지 잘 모르겠습니다. –

+0

마지막 지점을 얻지 마십시오. 핵심 데이터를 사용하면 객체는 NSManagedObject의 하위 클래스가되며 Key-Value-Coding의 모든 이점을 다른 모든 것의 위에 무료로 제공합니다. 나는 당신이 커스텀 객체와 함께 갈 것을 강력히 권한다. – Mundi

0

사전에 .isManuf, .isser 등을 원하지 않습니다.

당신은 할 수 있습니다

  • 는 .isManif와 목표 - C 클래스, isSer 속성 생성 (사용 @property 및 합성). 그렇지만 축약 된 이름보다는 더 읽기 쉬운 이름을 권장합니다. xml과 일치 할 필요는 없습니다.
  • didStartElement 메서드에서 alloc은 사용자 지정 개체를 초기화하고 속성을 할당합니다.
  • n 개가 돌아 왔으므로 NSMutableArray를 해당 클래스의 init에 만들고 헤더에 정의해야합니다. 방금 작성한 항목을 해당 변경 가능한 배열에 추가하십시오.
  • 구문 분석을 완료하면 xml에있는 모든 개체의 배열을 변경할 수 있습니다.
+0

NSMutableDictionary는이 경우 더 좋을 것입니다. 많은 데이터를 처리 할 것이므로, NSDictionary가 더 큰 데이터 세트로 더 빨리 abit된다는 것을 어딘가에서 읽은 것 같습니다. –

+0

사전이 매우 빠르며, 열쇠를 찾아야합니다. 그러나 사전은 순서를 유지하지 않습니다. NSMutableArray는 xml 데이터가 의미하는 것 인 순서 목록입니다. 특정 순서로 데이터 집합입니다. 사전 및 목록은 객체에 대한 참조를 저장하기 때문에 액세스 패턴에 따라 정렬 된 목록의 배열과 키의 빠른 액세스를위한 다른 조회 테이블 (사전)을 둘 다 저장하는 것이 좋습니다. – bryanmac

관련 문제