iOS IM 개발 준비 작업 (1) 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 해석 은 제 가 이렇게 많이 썼 습 니 다. 해석 을 제안 할 때 모델 로 데 이 터 를 저장 하면 후속 적 인 사용 이 편리 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.