解析

本文介绍了XML和JSON两种常用的数据交换格式,并通过示例代码详细展示了如何使用iOS平台下的SAX和DOM方式进行XML解析,以及如何进行JSON解析并将数据展示在UITableView上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML : 可扩展标记语言 

功能 : 

1. 数据交换

2. 内容管理

3. 用作配置文件

 

语法 : 

1. 声明

2. 节点使用一对儿标签表示 : 起始和结束标签

3. 根节点是起始节点, 只有一个. 节点可以嵌套

4. 节点可以有值, 存储在一对儿标签中

XML 解析的几种方式

1. SAX 解析 :  Simple API for XML 一行一行解析 ( 采用协议回调机制 )

-- --代码实现 -- --

 

#import "ViewController.h"

#import "Student.h"

//NSXMLParserDelegate 协议 是iOS中使用系统的SAX解析使用的协议
@interface ViewController ()<NSXMLParserDelegate>
//数据源数组
@property (nonatomic, strong) NSMutableArray *dataArray;
//当前解析的标签
@property (nonatomic, copy) NSString *currentElement;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor orangeColor];
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //[NSBundle mainBundle]代表的是左边那个文件夹栏
    //[pathForResource:@"文件名" ofType:@"文件格式"]; 也可以 [pathForResource:@"文件名.文件格式" ofType:nil];
    //获取XML_stu.txt文件的路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"XML_stu" ofType:@"txt"];
    //通过文件路径 创建一个NSData对象
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
    //指定代理人µ
    parser.delegate = self;
    //开始解析
    [parser parse];
    
}
//开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
#warning 初始化数据源数组
    self.dataArray = [NSMutableArray array];
}
//检测到开始标签
//第一个参数 : 类
//第二个参数 : elementName 标签的名字
//以下三个 基本不会使用到 , 所以基本为nil
//第三个参数 : 节点里面的命名空间 (xmlns)
//第四个参数 : qName
//第五个参数 : attrubuteDict 标签的属性
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
#warning 给currentWlement赋值
    self.currentElement = elementName;
#warning 如果标签的名字是student 则表示 要创建一个model, 并添加到数据源数组里面
    if ([elementName isEqualToString:@"student"]) {
        Student *student = [[Student alloc] init];
        [_dataArray addObject:student];
    }
}
//检测到标签中的值
//第一个参数 : 类
//第二个参数 : 值
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
#warning 将检测到的值 存入model的具体属性
#warning 给哪个属性赋值
#warning 给哪个model赋值 数组的最后一个model赋值
    Student *student = self.dataArray.lastObject;
    [student setValue:string forKey:self.currentElement];
}
//检测到结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    self.currentElement = nil;
    NSLog(@"endElement == %@",elementName);
}
//结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    for (Student *student in self.dataArray) {
        NSLog(@"name == %@, gender == %@, age == %ld, hobby == %@",student.name, student.gender, student.age, student.hobby);
    }
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

 

 

2. DOM 解析 : Document Object Model ( 文档对象模型 )

 

#import "SecondViewController.h"

#import "Student.h"

#import "GDataXMLNode.h"

@interface SecondViewController ()
//数据源数组
@property (nonatomic, strong) NSMutableArray *dataArray;

@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor magentaColor];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"XML_stu" ofType:@"txt"];
    self.dataArray = [NSMutableArray array];
    NSData *data = [NSData dataWithContentsOfFile:dataPath];
    
    NSError *error = nil;
    //GDataXMLDocument XML的 DOM解析使用的列
    // 第一个参数 : 解析的data对象
    // 第二个参数 : 一般就是0
    // 第三个参数 : error信息
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
    //获取到XML的根节点
    //获取到根节点里面所有的东西 也就是说 获取到students 里面包含的所有的东西
    GDataXMLElement *roomElement = [document rootElement];
//    NSLog(@"rootElement == %@",roomElement);
    for (GDataXMLElement *subElement in roomElement.children) {
        //这里获取到的subElement 保存的是student标签里面的内容 所以在这里创建对象
        Student *student = [Student new];
        for (GDataXMLElement *element in subElement.children) {
            //element 保存的就是student标签的所有子标签
            //根据标签的名字 给属性赋值
            //element.name 表示标签的名字
            //element.stringValue 表示标签的值
            if ([element.name isEqualToString:@"name"]) {
                student.name = element.stringValue;
            }
            if ([element.name isEqualToString:@"gender"]) {
                student.gender = element.stringValue;
            }
            if ([element.name isEqualToString:@"age"]) {
                student.age = [element.stringValue integerValue];
            }
            if ([element.name isEqualToString:@"hobby"]) {
                student.hobby = element.stringValue;
            }
        }
        [self.dataArray addObject:student];
    }
    for (Student *stu in self.dataArray) {
        NSLog(@"%@ %@ %ld %@", stu.name, stu.gender, stu.age, stu.hobby);
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end

JSON解析 ( JavaScript Object Notation )

功能 : 

1. 数据交换

2. 内容管理

3. 配置文件

-- -- 代码实现 -- -- 

#import "ThirdViewController.h"

@interface ThirdViewController ()

@end

@implementation ThirdViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"JSON_stu" ofType:@"txt"];
    
    NSData *data = [NSData dataWithContentsOfFile:path];
    /**
     NSJSONReadingMutableContainers 返回一个数组或者字典
     NSJSONReadingMutableLeaves 返回一个字符串
     NSJSONReadingAllowFragments 返回一个任意类型的对象
     */
    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"array == %@", array);
    for (NSDictionary *dic in array) {
        NSLog(@"dic == %@", [dic objectForKey:@"content"]);
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end

-- --代码实现 利用JSON解析展示在UITableView上 --

#import "FifthViewController.h"

@interface FifthViewController ()<UITableViewDelegate, UITableViewDataSource>
//数据源数组
@property (nonatomic, strong) UITableView  *tableView;

@property (nonatomic, strong) NSMutableArray *dataArray;

@end

@implementation FifthViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"movie" ofType:@"txt"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    
    self.dataArray = [NSMutableArray arrayWithArray:array];
    

    self.tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:(UITableViewStylePlain)];
    [self.view addSubview:_tableView];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return self.dataArray.count;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSString *string = [self.dataArray[section] objectForKey:@"title"];
    return string;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //取出来的是数组包含的字典,再通过字典的key : data 取出来一个数组
    NSArray *array = [self.dataArray[section] objectForKey:@"data"];
    return array.count;
    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    NSArray *arr = [self.dataArray[indexPath.section] objectForKey:@"data"];
    NSDictionary *dic = [arr objectAtIndex:indexPath.row];
    cell.textLabel.text = [dic objectForKey:@"title"];
    
    return cell;
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end

 

转载于:https://www.cnblogs.com/guosir/p/5354122.html

内容概要:本文围绕直微电网中带有恒功率负载(CPL)的DC/DC升压转换器的稳定控制问题展开研究,提出了一种复合预设性能控制策略。首先,通过精确反馈线性化技术将非线性不确定的DC转换器系统转化为Brunovsky标准型,然后利用非线性扰动观测器评估负载功率的动态变化和输出电压的调节精度。基于反步设计方法,设计了具有预设性能的复合非线性控制器,确保输出电压跟踪误差始终在预定义误差范围内。文章还对比了多种DC/DC转换器控制技术如脉冲调整技术、反馈线性化、滑模控制(SMC)、主动阻尼法和基于无源性的控制,分析了它们的优缺点。最后,通过数值仿真验证了所提控制器的有效性和优越性。 适合人群:从事电力电子、自动控制领域研究的学者和工程师,以及对先进控制算法感兴趣的研究生及以上学历人员。 使用场景及目标:①适用于需要精确控制输出电压处理恒功率负载的应用场景;②旨在实现快速稳定的电压跟踪,同时保证系统的鲁棒性和抗干扰能力;③为DC微电网中的功率转换系统提供兼顾瞬态性能和稳态精度的解决方案。 其他说明:文中不仅提供了详细的理论推导和算法实现,还通过Python代码演示了控制策略的具体实现过程,便于读者理解和实践。此外,文章还讨论了不同控制方法的特点和适用范围,为实际工程项目提供了有价值的参考。
内容概要:该论文介绍了一种名为偏振敏感强度衍射断层扫描(PS-IDT)的新型无参考三维偏振敏感计算成像技术。PS-IDT通过多角度圆偏振光照射样品,利用矢量多层光束传播模型(MSBP)和梯度下降算法迭代重建样品的三维各向异性分布。该技术无需干涉参考光或机械扫描,能够处理多重散射样品,通过强度测量实现3D成像。文中展示了对马铃薯淀粉颗粒和缓步类动物等样品的成功成像实验,提供了Python代码实现,包括系统初始化、前向传播、多层传播、重建算法以及数字体模验证等模块。 适用人群:具备一定光学成像和编程基础的研究人员,尤其是从事生物医学成像、材料科学成像领域的科研工作者。 使用场景及目标:①研究复杂散射样品(如生物组织、复合材料)的三维各向异性结构;②开发新型偏振敏感成像系统,提高成像分辨率和对比度;③验证和优化计算成像算法,应用于实际样品的高精度成像。 其他说明:PS-IDT技术相比传统偏振成像方法具有明显优势,如无需干涉装置、无需机械扫描、可处理多重散射等。然而,该技术也面临计算复杂度高、需要多角度数据采集等挑战。文中还提出了改进方向,如采用更高数值孔径(NA)物镜、引入深度学习超分辨率技术等,以进一步提升成像质量和效率。此外,文中提供的Python代码框架为研究人员提供了实用的工具,便于理解和应用该技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值