iOS IM 개발 준비 작업 (1) XML 분석

13016 단어
XML 해석 에 관 한 블 로그 가 많 습 니 다. 쓰 고 싶 지 않 았 는데;그러나 나 는 그들 이 말 하지 않 은 세부 사항 이 있다 는 것 을 알 았 다. 나 는 여기 서 세부 사항 을 더 말 했다.
우 리 는 어디에서 XML 을 사용 합 니까? 현재 json 은 이렇게 많이 사용 하고 있 습 니 다. XML 통신 을 사용 하 는 것 은 이미 많 지 않 습 니 다.내 가 만난 장면 은 우리 서버 에 여러 개가 있어 서 사용자 가 선택해 야 한 다 는 것 이다.그러면 우 리 는 정기 적 으로 서버 목록 을 유지 해 야 합 니 다. 이 서버 목록 의 프로필 을 다운로드 할 때마다 필요 합 니 다.물론 나 는 이 파일 을 해석 해 야 한다.XML 해석 에는 SAX 와 DOM 두 가지 모드 가 있다.저 는 시스템 을 사용 합 니 다. NSXMLPARSER 는 SAX 해석 입 니 다.
나 는 도구 류 를 하나 썼 는데, 먼저 코드 를 붙 였 는데, 아래 에 약간의 설명 이 있 을 것 이다.
.h
 1 #import <Foundation/Foundation.h>
 2 
 3 typedef NS_ENUM(NSInteger,xmlModelName){//       XML                      
 4     xmlModelNameFace,
 5     xmlModelNameServer,
 6 };
 7 @interface XMLParser : NSObject<NSXMLParserDelegate>
 8 //       Block
 9 @property(nonatomic,copy)void (^returnParseArray)(NSArray * returnArray);
10 @property(nonatomic,readonly)xmlModelName currentModelName;
11 
12 - (instancetype)initWithFilePath:(NSString *)path fileType:(NSString *)fileType modelName:(xmlModelName)modelName;
13 
14 - (void)startWithFilePath:(NSString *)path fileType:(NSString *)fileType;
15 @end

.m
 1 #import "XMLParser.h"
 2 #import "FaceModel.h"
 3 #import "ToolClient.h"
 4 #import "ServerModel.h"
 5 @implementation XMLParser{
 6     NSMutableArray * faceArray;
 7     NSMutableArray * serverArray;
 8 }
 9 
10 @synthesize currentModelName;
11 - (instancetype)initWithFilePath:(NSString *)path fileType:(NSString *)fileType modelName:(xmlModelName)modelName{
12     self = [super init];
13     if(self){
14         currentModelName = modelName;
15     }
16     return self;
17 }
18 
19 - (void)startWithFilePath:(NSString *)path fileType:(NSString *)fileType {
20     [self parseWithPath:path type:fileType];
21 }
22 //
23 - (void)parseWithPath:(NSString *)filePath type:(NSString *)fileType{
24     if (currentModelName == xmlModelNameFace) {
25         faceArray = [[NSMutableArray alloc]init];
26     }else if(currentModelName == xmlModelNameServer){
27         serverArray = [[NSMutableArray alloc]init];
28     }
29     NSData *xmlData = [[NSData alloc] initWithContentsOfFile:filePath];
30     if(xmlData && xmlData.length > 10){
31         NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];
32         [parser setShouldProcessNamespaces:NO];
33         [parser setShouldReportNamespacePrefixes:NO];
34         [parser setShouldResolveExternalEntities:NO];
35         [parser setDelegate:self];
36         BOOL success = [parser parse];
37         if(success) {
38             [self parseSuccess];
39         }else {
40             [ToolClient activityShowMessage:@"XML    " inView:[UIApplication sharedApplication].windows[0]];
41         }
42     }else {
43         [ToolClient activityShowMessage:@"XML    " inView:[UIApplication sharedApplication].windows[0]];
44     }
45 }
46 //       
47 - (void)parseSuccess {
48     if(self.returnParseArray){
49         if (currentModelName == xmlModelNameFace) {
50             self.returnParseArray(faceArray);
51         }else if(currentModelName == xmlModelNameServer){
52             self.returnParseArray(serverArray);
53         }
54     }
55 }
56 #pragma mark - NSXMLParserDelegate
57 
58 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
59   namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
60     attributes:(NSDictionary *)attributeDict {
61     //    NSLog(@"Name:%@",elementName);
62     
63     if([elementName isEqualToString:@"face"] && currentModelName == xmlModelNameFace) {
64         FaceModel * faceModel = [[FaceModel alloc]init];
65         faceModel.kID = [attributeDict[@"id"]intValue];
66         faceModel.kName = attributeDict[@"name"];
67         faceModel.kImage = attributeDict[@"file"];
68         [faceArray  addObject:faceModel];
69         faceModel = nil;
70     }else if([elementName isEqualToString:@"Server"] && currentModelName == xmlModelNameServer){
71         ServerModel * sModel = [[ServerModel alloc]init];
72         sModel.serverName = attributeDict[@"name"];
73         sModel.serverIP = attributeDict[@"ChatServerIP"];
74         sModel.chatPort = attributeDict[@"chatPort"];
75         sModel.fileServerIP = attributeDict[@"fileServerIP"];
76         sModel.filePort = attributeDict[@"filePort"];
77         [serverArray addObject:sModel];
78         sModel = nil;
79     }
80 }
81 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string  {
82     //    NSLog(@"value:%@",string);
83 }
84 - (void)parserDidEndDocument:(NSXMLParser *)parser {
85     //86     //    NSLog(@"%@",faceArray);
87     
88 }
89 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
90     //    NSLog(@"elementName:%@",elementName);
91     //    NSLog(@"qualifiedName:%@",qName);
92     //
93     //    NSLog(@"NSXMLParserDone");
94     //    NSLog(@"%@",faceArray);
95     //    NSLog(@"%i",(int)faceArray.count);
96     
97 }
98 @end

이제 XML 해석 설정 중 NO 로 설 정 된 세 개의 인자 가 어떤 역할 을 하 는 지 말씀 드 리 겠 습 니 다.
 1 [parser setShouldProcessNamespaces:NO]; 2 [parser setShouldReportNamespacePrefixes:NO]; 3 [parser setShouldResolveExternalEntities:NO]; 
첫 번 째 set Should ProcessNamespaces 라 는 속성 을 YES 로 설정 하면 이 두 가지 방법 은 값 출력 이 있 습 니 다. parser:didStartElement:namespaceURI:qualifiedName:attributes: 화해시키다  parser:didEndElement:namespaceURI:qualifiedName: 。 。     setShouldReportNamespacePrefixes YES , : parser:didStartMappingPrefix:toURI:  화해시키다  parser:didEndMappingPrefix:
세 번 째 setShouldResolveExternalEntities 이 속성 을 YES 로 설정 하면 이 방법 은 값 출력 이 있 습 니 다. parser: foundExternal Entity Declaration With Name: publiciD: systemID: 그 중에서 publicID 와 systemID 는 XML 문서 의 특유 한 표지 입 니 다.공식 문 서 는 이 두 변수 에 대해 이렇게 말 합 니 다.
You may access this property once a parsing operation has begun or after an error occurs.

XML 해석 이 시작 되 었 거나 오류 가 발생 했 을 때 다시 보 러 가 는 것 이다.그 러 니까 XML 을 잘 쓰 면 무시 하 라 는 거 야.
위의 코드 는 도구 류 입 니 다. 아래 단락 은 이 코드 를 어떻게 사용 하 는 지 알려 드릴 것 입 니 다.
 1 //      
 2 - (void)parseFile:(NSString *)filepath{
 3     NSLog(@"filepath%@",filepath);//      
 4     if(data.length>10){//        
 5         __weak SelectServerViewController * ws = self;//    
 6         // do parse
 7         XMLParser * xp = [[XMLParser alloc]initWithFilePath:filepath fileType:@"xml" modelName:xmlModelNameServer];
 8         //      
 9         xp.returnParseArray = ^(NSArray * array){
10             //         tableView   
11             [ws gotDataArray:array];
12         };
13         //      
14         [xp startWithFilePath:filepath fileType:@"xml"];
15     }
16    
17 }
18 
19 - (void)gotDataArray:(NSArray *)array {
20     if(array){
21 //        NSLog(@"array:%@",array);
22         dataArray = [array mutableCopy];
23         [myTableView reloadData];
24     }
25 }

XML 해석 은 제 가 이렇게 많이 썼 습 니 다. 해석 을 제안 할 때 모델 로 데 이 터 를 저장 하면 후속 적 인 사용 이 편리 합 니 다.

좋은 웹페이지 즐겨찾기