|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
AppDelegate.m#import?"AppDelegate.h"#import?"MainViewController.h"@implementation?AppDelegate-?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions{????self.window?=?[[UIWindow?alloc]?initWithFrame:[[UIScreen?mainScreen]?bounds]];
????//?Override?point?for?customization?after?application?launch.
????self.window.backgroundColor?=?[UIColor?whiteColor];
????[self.window?makeKeyAndVisible];
??????????????MainViewController?*mainVC?=?[[MainViewController?alloc]?init];
????UINavigationController?*naviVC?=?[[UINavigationController?alloc]?initWithRootViewController:mainVC];
????self.window.rootViewController?=?naviVC;
????[naviVC?release];
????[mainVC?release];
?????????[_window?release];
????return?YES;
}-?(void)dealloc{????[_window?release];
????[super?dealloc];
}-?(void)applicationWillResignActive:(UIApplication?*)application{????//?Sent?when?the?application?is?about?to?move?from?active?to?inactive?state.?This?can?occur?for?certain?types?of?temporary?interruptions?(such?as?an?incoming?phone?call?or?SMS?message)?or?when?the?user?quits?the?application?and?it?begins?the?transition?to?the?background?state.
????//?Use?this?method?to?pause?ongoing?tasks,?disable?timers,?and?throttle?down?OpenGL?ES?frame?rates.?Games?should?use?this?method?to?pause?the?game.
}-?(void)applicationDidEnterBackground:(UIApplication?*)application{????//?Use?this?method?to?release?shared?resources,?save?user?data,?invalidate?timers,?and?store?enough?application?state?information?to?restore?your?application?to?its?current?state?in?case?it?is?terminated?later.?
????//?If?your?application?supports?background?execution,?this?method?is?called?instead?of?applicationWillTerminate:?when?the?user?quits.
}-?(void)applicationWillEnterForeground:(UIApplication?*)application{????//?Called?as?part?of?the?transition?from?the?background?to?the?inactive?state;?here?you?can?undo?many?of?the?changes?made?on?entering?the?background.
}-?(void)applicationDidBecomeActive:(UIApplication?*)application{????//?Restart?any?tasks?that?were?paused?(or?not?yet?started)?while?the?application?was?inactive.?If?the?application?was?previously?in?the?background,?optionally?refresh?the?user?interface.
}-?(void)applicationWillTerminate:(UIApplication?*)application{????//?Called?when?the?application?is?about?to?terminate.?Save?data?if?appropriate.?See?also?applicationDidEnterBackground:.
}@end |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
MainViewController.m??#import?"MainViewController.h"#import?"XMLSAXParser.h"#import?"JSONParser.h"@interface?MainViewController?()@end@implementation?MainViewController-?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil{????self?=?[super?initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];
????if?(self)?{
????????//?Custom?initialization
????}
????return?self;
}-?(void)viewDidLoad{????[super?viewDidLoad];
????//?Do?any?additional?setup?after?loading?the?view.
????self.view.backgroundColor?=?[UIColor?cyanColor];
?????????//XML??SAX解析(逐行解析)
????XMLSAXParser?*parser?=?[[XMLSAXParser?alloc]?init];
????[parser?startParse];
????NSLog(@"解析后的%@",parser.array);
????[parser?release];
}-?(void)didReceiveMemoryWarning{????[super?didReceiveMemoryWarning];
????//?Dispose?of?any?resources?that?can?be?recreated.
}/*#pragma?mark?-?Navigation//?In?a?storyboard-based?application,?you?will?often?want?to?do?a?little?preparation?before?navigation-?(void)prepareForSegue:(UIStoryboardSegue?*)segue?sender:(id)sender{????//?Get?the?new?view?controller?using?[segue?destinationViewController].
????//?Pass?the?selected?object?to?the?new?view?controller.
}*/@end |
|
1
2
3
4
5
6
7
8
|
XMLSAXParser.h#import?<Foundation/Foundation.h>@interface?XMLSAXParser?:?NSObject<NSXMLParserDelegate>@property?(nonatomic?,?retain)NSMutableArray?*array;????//装学生对象
@property?(nonatomic?,?retain)NSString?*tempStr;???//临时健在节点内容
-?(void)startParse;??//开始解析,逐行解析
-?(void)startDOMParse;?//开始dom解析,按节点解析
@end |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
XMLSAXParser.m#import?"XMLSAXParser.h"#import?"Student.h"#import?"GDataXMLNode.h"@implementation?XMLSAXParser//XML解析:逐行解析-?(void)startParse;{????//XML解析:逐行解析
?????????//从文件列表中读取数据
????//1.获取文件路径
????NSString?*sourcePath?=?[[NSBundle?mainBundle]?pathForResource:@"Student"?ofType:@"xml"];
????//2.通过路径把文件转换成NSData类型
????NSData?*data?=?[NSData?dataWithContentsOfFile:sourcePath];
?????????//创建的时候需要给parser一个字符串数据(NSData)
????NSXMLParser?*parser?=?[[NSXMLParser?alloc]?initWithData:data];
?????????//设定代理人
????parser.delegate?=?self;
????//开始对文件进行解析
????[parser?parse];
????//内存管理
????[parser?release];
?????}-?(void)parser:(NSXMLParser?*)parser?didStartElement:(NSString?*)elementName?namespaceURI:(NSString?*)namespaceURI?qualifiedName:(NSString?*)qName?attributes:(NSDictionary?*)attributeDict{????//当找到节点头的时候,体统调用这个方法
????NSLog(@"节点头");
?????????if?([elementName?isEqualToString:@"students"])?{
????????//当找到students节点头的时候,初始化数组
????????self.array?=?[NSMutableArray?array];
????}else?if?([elementName?isEqualToString:@"student"]){
????????//当找到student节点时候,创建一个新的学生对象,添加到数组中
????????Student?*stu?=?[[Student?alloc]?init];
????????[self.array?addObject:stu];
????????[stu?release];
?????????????}
}-?(void)parser:(NSXMLParser?*)parser?foundCharacters:(NSString?*)string{????//当找到节点内容的时候,调用
????NSLog(@"节点内容");
????//把内容保存起来,只要碰到节点内容,下一个肯定是节点尾
????self.tempStr?=?string;
}-?(void)parser:(NSXMLParser?*)parser?didEndElement:(NSString?*)elementName?namespaceURI:(NSString?*)namespaceURI?qualifiedName:(NSString?*)qName{????//当找到节点尾时候调用
????NSLog(@"节点尾");
?????????//取得之前保存的student对象
????Student?*stu?=?[self.array?lastObject];???//核心代码,懂了没?.........
????if?([elementName?isEqualToString:@"name"])?{
????????stu.name?=?self.tempStr;
????}else?if?([elementName?isEqualToString:@"sex"]){
????????stu.sex?=?self.tempStr;
????}else?if?([elementName?isEqualToString:@"phone"]){
????????stu.phone?=?self.tempStr;
????}else?if?([elementName?isEqualToString:@"number"]){
????????stu.number?=?self.tempStr;
????}
}//开始dom解析,按节点解析-?(void)startDOMParse{????//按节点解析
????//1.获取要解析文件的文件信息
????NSString?*xmlPath?=?[[NSBundle?mainBundle]pathForResource:@"Student"?ofType:@"xml"];
????NSData?*data?=?[NSData?dataWithContentsOfFile:xmlPath];
?????????//参数1:要解析的xml串
????//参数2:随便
????//参数3:错误信息
????GDataXMLDocument?*doc?=?[[GDataXMLDocument?alloc]?initWithData:data?options:0?error:nil];
?????????//2.获取文件的根节点
????GDataXMLElement?*rootElement?=?[doc?rootElement];
?????????//3.进一步搜索所有的子节点
????//返回一个装满了student节点(GDataXMLElement对象)的数组
????NSArray?*array?=?[rootElement?elementsForName:@"student"];
?????????self.array?=?[NSMutableArray?array];
????//4.遍历数组,把student节点的每个子节点取出来
????for?(GDataXMLElement?*element?in?array)?{
?????????????????Student?*stu?=?[[Student?alloc]?init];
?????????????????GDataXMLElement?*nameElement?=?[[element?elementsForName:@"name"]lastObject];
?????????????????//从name节点中取值
????????NSString?*name?=?[nameElement?stringValue];
?????????????????//给学生对象的属性赋值
????????stu.name?=?name;
?????????????????//把学生对象添加到数组中-----------其他的雷同
????????[self.array?addObject:stu];
????????[stu?release];
????}
}@end |
|
1
2
3
4
5
6
7
8
9
|
Student.h??#import?<Foundation/Foundation.h>@interface?Student?:?NSObject@property?(nonatomic?,?retain)NSString?*number;@property?(nonatomic?,?retain)NSString?*name;@property?(nonatomic?,?retain)NSString?*sex;@property?(nonatomic?,?copy)NSString?*phone;@end |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#import?"Student.h"@implementation?Student-?(void)dealloc{????[_name?release];
????[_number?release];
????[_sex?release];
????[_phone?release];
????[super?dealloc];
}//当这个类的对象被NSLog输出时候,系统会先调用这个方法,如果这个方法被重写,就直接输出重写的内容,否则就输出系统默认的内容-?(NSString?*)description{????return?[NSString?stringWithFormat:@"name:%@?sex:%@?phone:%@?number:%@",?self.name,?self.sex,?self.phone,?self.number];
}@end |
|
1
2
3
4
5
6
7
8
|
<?xml?version="1.0"?encoding="UTF-8"?>??
<employees>???<employee>???<name>ddviplinux</name>???<sex>m</sex>???<age>30</age>???</employee>???</employees> |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public?void?parserXml(String?fileName)?{?????try?{???
????DocumentBuilderFactory?dbf?=?DocumentBuilderFactory.newInstance();??
????DocumentBuilder?db?=?dbf.newDocumentBuilder();???
????Document?document?=?db.parse(fileName);???
????NodeList?employees?=?document.getChildNodes();???
????for?(int?i?=?0;?i?<?employees.getLength();?i++)?{???
??????Node?employee?=?employees.item(i);???
??????NodeList?employeeInfo?=?employee.getChildNodes();???
??????for?(int?j?=?0;?j?<?employeeInfo.getLength();?j++)?{???
????????Node?node?=?employeeInfo.item(j);???
????????NodeList?employeeMeta?=?node.getChildNodes();???
????????for?(int?k?=?0;?k?<?employeeMeta.getLength();?k++)?{???
??????????System.out.println(employeeMeta.item(k).getNodeName()?+?":"?+?employeeMeta.item(k).getTextContent());???
????????}???
??????}???
????}??
????System.out.println("解析完毕");??
??}?catch?(Exception?e)?{???
??????System.out.println(e.getMessage());???
??}??
} |
?
?
|
1
2
3
4
5
6
7
8
9
10
|
public?void?parserXml(String?fileName)?{?????SAXParserFactory?saxfac?=?SAXParserFactory.newInstance();???
??try?{???
????SAXParser?saxparser?=?saxfac.newSAXParser();???
????InputStream?is?=?new?FileInputStream(fileName);???
????saxparser.parse(is,?new?MySAXHandler());???
??}?catch?(Exception?e)?{???
????e.printStackTrace();???
??}???
} |
XML的两种解析方式逐行解析(SAX解析)节点解析(DOM解析);
原文:http://aijuans.iteye.com/blog/2162277