XML和son的数据解析

XML数据解析与DOM实现
本文详细介绍了如何使用Objective-C语言解析XML文件,包括设置解析方法、数据存储、协议响应和DOM实现等步骤,旨在帮助开发者高效处理XML数据。
部署运行你感兴趣的模型镜像

XML的数据解析

1.先设置一个开始解析的方法   2.把处理好的数据学生放到数组里,然后直接使用数组就可以了

// 先设置一个开始解析的方法
- (void)startParser;
// 把处理好的数据学生,放到数组里,然后直接使用数组就可以
@property(nonatomic, retain)NSMutableArray *stuArr;

2.开始解析的方法----->1.先找到文件路径 2.把路径对应的文件转换成NSData  3.创建一个XML文件  4.设置代理人  5.开始解析

- (void)startParser{
    // 先找到文件的路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
    // 把路径对应的文件转换成NSData
    NSData *data = [NSData dataWithContentsOfFile:path];
    // 创建一个xml解析工具
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    // 设置代理人
    parser.delegate = self;
    // 开始解析
    [parser parse];

}

3.协议方法,开始解析,执行协议方法didse 1.根据不同的节点名,进行不同的操作   2.小的student里创建一个学生对象

#pragma mark 开始解析,执行协议方法
// didsE
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    // 根据不同的节点名,进行不同的操作
    if ([elementName isEqualToString:@"Student"]) {
        self.stuArr = [NSMutableArray array];
        
    } else if ([elementName isEqualToString:@"student"]){
        // 小的student, 创建一个学生对象
        Student *stu = [[Student alloc] init];
        [self.stuArr addObject:stu];
    }
}

4.通过这个协议方法能找到标签之间的内容,但是标签之间如果夹的还是标签,则没有任何内容  这个方法只要找到节点内容就会触发

#pragma mark 通过这个协议方法能找到标签之间的内容,但是标签之间如果夹的还是标签,则没有任何内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    // 这个方法只要找到节点内容就会触发
    self.tempStr = string;
}

5.当节点结束的时候,就会执行这个方法  先找到没有设置好的学生,(数组的最后一个) 用KVC的方法赋值

#pragma mark 当节点结束的时候,就会执行这个方法
// 第一个方法
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    // 先找到没有设置好的学生
    Student *stu = [self.stuArr lastObject];
    // KVC方法,赋值
    [stu setValue:self.tempStr forKey:elementName];
}

DOM(需要用三方)  前两部和parser一样(可以写成加号方法)

- (void)startDom;

@property(nonatomic, retain)NSMutableArray *stuArr;

// 加号方法
+ (NSMutableArray *)startXMLDom;

先获取路径,

然后创建对象(创建对象的三个参数,参数一:需要处理数据  参数二:没有0就行 参数三:错误信息)  

先到数据的根节点  根据根节点,找到所有的student的节点

- (void)startDom{
    // 先获取路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    // 创建对象
    // 参数一:需要处理数据
    // 参数二:没什么用, 0就行
    // 参数三:错误信息
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
    
    // 找到数据的根节点
    GDataXMLElement *rootRlement = [document rootElement];
    // 根据根节点,找到所有的student的节点
    NSArray *arr = [rootRlement elementsForName:@"student"];
    // 先对属性数组进行初始化
    self.stuArr = [NSMutableArray array];
    // 遍历数组
    for (NSInteger i = 0; i < arr.count; i++) {
        // 创建一个学生对象
        Student *stu = [[Student alloc] init];
        // 找到每一个student节点对应的内容
        GDataXMLElement *stuElement = arr[i];
        // 根据节点名,对student节点里的内容进行获取
        GDataXMLElement *name = [[stuElement elementsForName:@"name"] lastObject];
        // 对学生姓名进行赋值
        stu.name = [name stringValue];
        [self.stuArr addObject:stu];
        
        
        
    }

}

+ (NSMutableArray *)startXMLDom{
    // 先获取路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
    GDataXMLElement *rootRlement = [document rootElement];
    NSArray *arr = [rootRlement elementsForName:@"student"];
    NSMutableArray *stuArr = [NSMutableArray array];
    for (NSInteger i = 0; i < arr.count; i++) {
        Student *stu = [[Student alloc] init];
        GDataXMLElement *stuElement = arr[i];
        GDataXMLElement *name = [[stuElement elementsForName:@"name"] lastObject];
        stu.name  = [name stringValue];
        [stuArr addObject:stu];
    }
    return stuArr;
}










































您可能感兴趣的与本文相关的镜像

Qwen-Image

Qwen-Image

图片生成
Qwen

Qwen-Image是阿里云通义千问团队于2025年8月发布的亿参数图像生成基础模型,其最大亮点是强大的复杂文本渲染和精确图像编辑能力,能够生成包含多行、段落级中英文文本的高保真图像

### 数据格式与结构 JSON(JavaScript Object Notation)XML(eXtensible Markup Language)是两种常用的数据交换格式,它们在结构、用途适用场景上存在显著差异。 JSON 是一种轻量级的数据交换格式,以键值对的形式表示数据。它支持多种基本数据类型,如字符串、数字、布尔值、数组对象。JSON 的语法简洁,易于读写,同时也易于解析生成,特别是在 JavaScript 环境中,可以直接通过 `eval()` 或 `JSON.parse()` 进行解析[^1]。例如: ```json { "name": "Alice", "age": 25, "isStudent": false, "hobbies": ["reading", "coding"] } ``` XML 是一种可扩展的标记语言,主要用于存储传输数据。它使用标签结构来描述数据,具有较强的可读性通用性。XML 的语法较为复杂,通常需要专门的解析器进行处理。例如: ```xml <person> <name>Alice</name> <age>25</age> <isStudent>false</isStudent> <hobbies> <hobby>reading</hobby> <hobby>coding</hobby> </hobbies> </person> ``` ### 数据体积与传输效率 在数据体积方面,JSON 的格式更加紧凑,占用带宽更小,传输速度更快。由于 JSON 没有冗余的闭合标签,其数据体积通常比等效的 XML 数据小很多[^2]。例如,一个包含多个字段的用户信息对象,在 JSON 中可以压缩为一行,而在 XML 中则需要多个嵌套标签,导致文件体积显著增加。 在数据交互效率方面,JSON 与 JavaScript 的兼容性更好,可以直接通过 `eval()` 或 `JSON.parse()` 转换为 JavaScript 对象,解析速度更快[^3]。相比之下,XML 需要通过 DOM 或 SAX 等解析器进行处理,解析过程较为复杂,且不同浏览器对 XML解析方式不一致,增加了开发维护的难度[^1]。 ### 数据描述能力与通用性 在数据描述能力方面,XML 的结构更加清晰,支持复杂的嵌套关系命名空间,适用于需要详细描述数据结构的场景。XML 的标签可以自定义,便于不同系统之间的数据交互,尤其适合需要长期存储或跨平台共享的数据格式[^1]。 而 JSON数据描述方面相对较弱,虽然可以通过嵌套对象数组实现复杂的数据结构,但其可读性不如 XML。JSON 更适合用于轻量级的数据交换,尤其是在 Web 应用中,作为前后端通信的中间格式,能够显著提升传输效率解析速度[^2]。 ### 使用场景与生态系统支持 JSON 在现代 Web 开发中得到了广泛支持,尤其是在 RESTful API 设计中,JSON 已成为事实上的标准数据格式。许多编程语言都提供了内置的 JSON 解析生成工具,例如 PHP 的 `json_encode()` `json_decode()`,Python 的 `json` 模块,JavaScript 的 `JSON.stringify()` `JSON.parse()` 等。这些工具使得 JSON 在服务器端客户端之间的数据交互更加高效便捷[^1]。 XML 虽然在早期的 Web 服务中占据主导地位,例如 SOAP 协议,但由于其体积大、解析复杂等问题,逐渐被 JSON 取代。不过,XML 仍然在某些特定领域中具有不可替代的地位,例如配置文件、文档格式(如 Microsoft Office 的 `.docx` `.xlsx` 文件)、以及需要复杂数据结构描述的场景[^3]。 ### 总结与对比 | 特性 | JSON | XML | |------|------|-----| | **数据结构** | 键值对、数组、对象 | 标签结构、命名空间 | | **数据体积** | 小,压缩率高 | 大,冗余标签多 | | **解析速度** | 快,JavaScript 原生支持 | 慢,需解析器支持 | | **可读性** | 中等,结构紧凑 | 高,标签结构清晰 | | **通用性** | 广泛用于 Web API | 广泛用于配置文件、文档 | | **开发维护** | 简单,代码量少 | 复杂,需处理标签嵌套 | ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值