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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律