iOS基础 - 网络:XML | GDataXMLNode

▶ XML

XML:Extensible Markup language 可扩展标记语⾔言,它是主流数据格式之一,可以用来存储和传输数据,主要作用是数据交换、内容管理、⽤作配置文件

XML 解析有两种

A. SAX 解析:simple API for xml,基于事件驱动的解析方式,逐行解析,采用协议回调机制

B. DOM 解析:document Object model,解析时需要将 XML文件 整体读入,并且将 XML 结构化成树状,使用时再通过树状结构读取相关数据

在 Xcode 中如何新建 xml 源文件 ?选择 iOS/other/empty,新建文件即可,后缀名需手动填写。XML 解析工具有 NSXMLParser、GDataXMLNode、TochXML、KissXML 等

XML 数据结构语法

A. 节点使用⼀对标签表⽰:起始和结束标签

B. 根节点是起始节点,只有⼀个

C. 节点可以嵌套;也可以有值,存储在⼀对儿标签中

D. 结点添加属性:数据存储一般只有两个位置,一个是结点属性,一个是子节点

 

▶ NSXMLParser

它是 iOS ⾃带的 XML 解析类,采⽤ SAX ⽅式解析数据。解析过程由 NSXMLParserDelegate 协议⽅法回调:开始标签 -> 取值 -> 结束标签 -> 取值。使用方式如下

// - Students.xml :XML文件

复制代码
 1 <Students>
 2 
 3     <Student homeTown = "Lewisham" petName = "Keylee">
 4         <name>Hazell</name>
 5         <sex>Female</sex>
 6         <age>26</age>
 7         <phoneNumber>15555555555</phoneNumber>
 8     </Student>
 9 
10     <Student>
11         <name>Lee</name>
12         <sex>Male</sex>
13         <age>32</age>
14         <phoneNumber>18888888888</phoneNumber>
15     </Student>
16 
17     <Student>
18         <name>Solina</name>
19         <sex>Female</sex>
20         <age>22</age>
21         <phoneNumber>17777777777</phoneNumber>
22     </Student>
23 
24 </Students>
复制代码

// - ViewController.m

复制代码
 1 #import "ViewController.h"
 2 @interface ViewController ()<NSXMLParserDelegate>// 接受协议
 3 
 4 @end
 5 @implementation ViewController
 6 
 7 - (void)viewDidLoad {
 8     [super viewDidLoad];
 9 
10 
11     // 路径
12     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"];
13     NSData *data = [NSData dataWithContentsOfFile:filePath];
14     // 通过 data 创建一个解析器
15     NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
16     xmlParser.delegate = self;// 代理
17     [xmlParser parse];// 开始解析
18 }
19 
20 #pragma mark - <NSXMLParserDelegate>
21 // 扫描到一个开始标签
22 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
23     NSLog(@"%s",__func__);
24     NSLog(@"didStartElement = %@,namespaceURI = %@ ,qualifiedName = %@,attributes = %@",elementName,namespaceURI,qName,attributeDict);
25 }
26 
27 // 扫描到一个结束标签
28 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
29     NSLog(@"%s",__func__);
30     NSLog(@"didEndElement = %@,namespaceURI = %@ ,qualifiedName = %@",elementName,namespaceURI,qName);
31 }
32 
33 // 扫描到内容
34 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
35     NSLog(@"%s",__func__);
36     NSLog(@"foundCharacters = %@",string);
37 }
38 
39 // 错误发生
40 - (void)parser:(NSXMLParser *)parser validationErrorOccurred:(NSError *)validationError{
41     NSLog(@"%s",__func__);
42     NSLog(@"validationErrorOccurred = %@",validationError);
43 }
44 
45 
46 @end
复制代码

▶ GDataXMLNode

GDataXMLNode 是 Google 提供的开源 XML 解析类,对 libxml2.dylib 进行了 Objective-C 的封装,能对较小或中等的 xml文档 进行读写操作且支持 XPath语法。使用 GDataXMLNode 前,Xcode 需导入  libxml2.tbd 框架!注:它默认在 MRC模式 下使用,若编译出现  libxml/tree.h' file not found  错误,只需在 build Settings/Header Search Paths 中,添加  ${SDKROOT}/usr/include/libxml2 即可

代码示例:如何使用 GDataXMLNode 

// - ViewController.m

复制代码
 1 #import "ViewController.h"
 2 #import "GDataXMLNode.h"
 3 @implementation ViewController
 4 
 5 - (void)viewDidLoad {
 6     [super viewDidLoad];
 7 
 8     // 路径
 9     NSString *filePath02 = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"];
10     NSData *data02 = [NSData dataWithContentsOfFile:filePath02];
11 
12     // GDataXMLDocument
13     GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data02 options:0 error:nil];
14     
15     // 文档树
16     GDataXMLElement *rootElement = [document rootElement];
17     //NSLog(@"%@",rootElement);
18 
19     // 获取根节点下面所有叫做 student 的子节点
20     NSArray *allStudentElements = [rootElement elementsForName:@"Student"];
21     //NSLog(@"%@",allStudentElements);
22 
23     for (GDataXMLElement *stuElement in allStudentElements) {
24         //NSLog(@"%@",stuElement);
25 
26         NSString *name = [[[stuElement elementsForName:@"name"] objectAtIndex:0] stringValue];
27         NSLog(@"%@",name);
28         NSString *age = [[[stuElement elementsForName:@"age"] objectAtIndex:0] stringValue];
29         NSLog(@"%@",age);
30         NSString *phoneNumber = [[[stuElement elementsForName:@"phoneNumber"] objectAtIndex:0] stringValue];
31         NSLog(@"%@",phoneNumber);
32         NSString *sex = [[[stuElement elementsForName:@"sex"] objectAtIndex:0] stringValue];
33         NSLog(@"%@",sex);
34     }
35 }
36 
37 // 相对路径、绝对路径
38 -(void)learnPath{
39 
40     // 路径
41     // 1、绝对路径:从当前的节点(调用方法的节点)开始,给出一个完整路径。如 Student/name
42     // 2、相对路径,以 // 打头,后接节点名称,凡是满足此路径的,全部返回,如 //name 获得所有的 name 节点
43 
44     NSString *filePath02 = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
45     NSData *data02 = [NSData dataWithContentsOfFile:filePath02];
46 
47     GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data02 options:0 error:nil];
48     GDataXMLElement *rootElement = [document rootElement];// 把 xml 文档读入内存生成 xml 文档树
49 
50     // 相对路径
51     NSArray *stuElements = [rootElement nodesForXPath:@"//Student" error:nil];
52     NSLog(@"%@",stuElements);
53     GDataXMLElement *firstStuElement = [stuElements objectAtIndex:0];// 返回节点
54     NSString *homeTown = [[firstStuElement attributeForName:@"homeTown"] stringValue];
55     NSLog(@"%@",homeTown);
56 
57     // 绝对路径
58     NSArray * nameElements = [rootElement nodesForXPath:@"Student/name" error:nil];
59     NSLog(@"%@",nameElements);
60 
61 }
62 
63 @end
复制代码

 

posted on   低头捡石頭  阅读(40)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示