• XML


     

    XML

     

    XML的设计主要是用来描述⼀些信息,并且进⾏行信息的传送,与HTML不同,HTML主要用来显示信息,而XML主要用来传递信息。

    XML(eXtensible Markup Language) 可扩展标记语言,计算机之间使用这些标记理解并处理各种信息,XML⽂档可以由 XML的声明开始,XML的声明描述了当前文档是一个XML文 档。

     

    xml和json对比:

    json(相对于xml的数据,轻巧,传输速率高,冗余的数据少。缺点:可读性差) 

    xml(冗余的数据多,优点:可读性强,扩展性强)

     

    一【声明】

    XML声明是在文档开头,根节点之前的,可以省略。声明中包含了整个文档的信息,比如说版本,字符编码等信息。

    <?xml version=”1.0” encoding=”UTF-8” ?>

    这是一个XML声明,由<?xml开始到?>结束,包含了xml的版本以及编码等信息。

     

    二【节点】(元素节点)

    XML⽂档主要由节点构成。节点指的是从开始标签到结束标签,最外层叫根节点

     <title>Harry Potter</title>

    这是一个XML节点,节点的标题是title,节点的内容是Harry Potter。

     

    三【属性】

    属性是使用键值形式来描述与节点相关的一些信息。属性⼀般出现在开始标记中,不能出现在结束标记中,属性值必须加引号。一个节点不能包含多个同名属性。

    <title id=”27”>Harry Potter</title> 

    对这个节点添加一个属性,属性名称为id,属性值为27(属性也是节点的一种,属性节点指的就是 id=”27”)

     

    四【基本值】

    又叫原子值,指的是节点的内容

    1,<title>Harry Potter</title>中Harry Potter就叫基本值

    2,属性值也是基本值

     

    五【节点关系】

    每个xml只有一个根节点(最外层的节点)

    父:上一级节点

    子:下一级节点

    兄弟:同级节点

    先辈:父、父的父,父的父的父。。。

    后代:子、子的子、子的子的子。。。

     

    六【操作】

    //进行xml数据解析的第三方库(工作中也非常实用)

    #import "GDataXMLNode.h"

    (需要导入一个系统框架,添加一个文件路径)

    libxml2包.....Header Search Paths中添加 /usr/include/libxml2路径

     

    1,普通解析方法

     

    NSString *path = [[NSBundle mainBundle] pathForResource:@"xml" ofType:@"txt"];

    NSData *xmlData = [NSData dataWithContentsOfFile:path];

    //创建xml解析作用的容器,使用xml格式的data

        GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:xmlData options:0 error:nil];

     

    //取到xml数据的根节点(所有的节点都是GDataXMLElement对象)

        GDataXMLElement *root = [document rootElement];

     

    //取到root节点下名为books的子节点

        NSArray *booksArray =[root elementsForName:@"books"];

     

       //取到数组中的第0个books节点

        GDataXMLElement *books = [booksArray objectAtIndex:0];

     

        //取第0个books下面的book节点

        NSArray *bookArray = [books elementsForName:@"book"];

     

    for (GDataXMLElement *book in bookArray) {

     

    //拿到节点的属性,属性也是节点的一种

            NSArray *attr= book.attributes;

            //取到id属性的对象(第0个)

            GDataXMLElement *idAttr = [attr objectAtIndex:0];

            //打印属性的值

            NSLog(@"idValue:%@",idAttr.stringValue);

     

            NSArray *names =[book elementsForName:@"name"];

            //取到book下的name节点

            GDataXMLElement *name = [names objectAtIndex:0];

            //取到name节点的内容(<name>书名</name>)

            NSLog(@"name:%@",name.stringValue);

            //取到当前节点的名称(标题)

            NSLog(@"title:%@",name.name);

            //取到整个节点

            NSLog(@"xmlstring:%@",name.XMLString);

        }

     

     

    2,xpath

    //xpath语句是一种对xml文档进行查找的语言,表述的是查找节点的位置

     

    NSString *snsPath = [[NSBundle mainBundle] pathForResource:@"sns" ofType:@"txt"];

       NSString *snsString = [NSString stringWithContentsOfFile:snsPath encoding:NSUTF8StringEncoding error:nil];

     

    //进行xml解析的一个容器,把要解析的xml字符串放到容器中,通过容器进行后续的操作

    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:snsString options:0 error:nil];

     

        //user在xml文档中的路径

        NSString *userPath = @"/root/user_list/user";

     

    //根据xpath语句提供的节点的路径,取到相应的节点,放到数组中

        NSArray *users =[doc nodesForXPath:userPath error:nil];

     

    //(所有的节点(根节点或子节点)都是GDataXMLElement类的对象)

        for (GDataXMLElement *user in users) {

            

            //users中所有节点标题为username的子节点

            NSArray *userNames = [user elementsForName:@"username"];

            GDataXMLElement *userName = [userNames objectAtIndex:0];

            

            //节点基本值

            NSLog(@"userName:%@",userName.stringValue);

        }

     

    //双斜杠+节点名称,xpth语句,相对路径

        //拿到一个节点中所有名为totalcount的后代节点

        NSArray *totals = [doc nodesForXPath:@"//totalcount" error:nil];

        GDataXMLElement *totalCount = [totals objectAtIndex:0];

        NSLog(@"countValue:%@",totalCount.stringValue);

    #import "ViewController.h"

    #import "GDataXMLNode.h"

     

    @interface ViewController ()

     

    @end

     

    @implementation ViewController

     

    - (void)viewDidLoad

    {

        [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

        

    //    [self xml];

        [self xpath];

    }

     

    //使用xpath语句(代表节点路径的表达式)

    - (void)xpath

    {

        NSString *path = [[NSBundle mainBundle] pathForResource:@"sns" ofType:@"txt"];

        NSData *data = [NSData dataWithContentsOfFile:path];

        GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

        

        //使用绝对路径

        NSArray *userArr = [document nodesForXPath:@"/root/user_list/user/realname" error:nil];

        NSLog(@"userArr.count = %d",userArr.count);

        

        for (GDataXMLElement *realNameEle in userArr) {

            NSLog(@"realName = %@",realNameEle.stringValue);

        }

        

        //相对路径(所有节点名是username的节点)

        NSArray *userNameArr = [document nodesForXPath:@"//username" error:nil];

        NSLog(@"userNameArr.count = %d",userNameArr.count);

    }

     

    //xml数据的基本解析方式

    - (void)xml

    {

        NSString *path = [[NSBundle mainBundle] pathForResource:@"xml" ofType:@"txt"];

        NSData *data = [NSData dataWithContentsOfFile:path];

        

        //使用GData进行xml解析,首先把数据放到解析器里

        GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

        

        //找到根节点

        GDataXMLElement *rootElement = [document rootElement];

        //用字符串的方式打印节点

        NSLog(@"root = %@",rootElement.XMLString);

        

        //从某个节点中查询【子节点】,子节点允许重名,需要用数组接收

        NSArray *booksArr = [rootElement elementsForName:@"books"];

        //root里只有一个books子节点

        GDataXMLElement *booksElement = [booksArr lastObject];

        NSLog(@"books = %@",booksElement.XMLString);

        

        //查询book子节点

        NSArray *bookArr = [booksElement elementsForName:@"book"];

        NSLog(@"bookArr.count = %d",bookArr.count);

        

        for (GDataXMLElement *bookElement in bookArr) {

            //查询某个节点所有的属性

            NSArray *attributes = [bookElement attributes];

            //属性是特殊的节点

            GDataXMLElement *idElement = [attributes firstObject];

            //打印节点的基本值

            NSLog(@"id = %@",idElement.stringValue);

            

            GDataXMLElement *autherElement = [[bookElement elementsForName:@"auther"] lastObject];

            GDataXMLElement *autherNameElement = [[autherElement elementsForName:@"name"] lastObject];

            //打印节点名和节点值

            NSLog(@"%@:%@",autherNameElement.name,autherNameElement.stringValue);

        }

    }

     

    - (void)didReceiveMemoryWarning

    {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

     

    @end

     

    ------------------------------------------------------------------------------------分割------------------------------------------------------------------------------------

    #import "ViewController.h"

    #import "GDataXMLNode.h"

    #import "UIImageView+WebCache.h"

     

    @interface ViewController () <UITableViewDataSource,UITableViewDelegate,NSURLConnectionDataDelegate>

     

    {

        UITableView *_myTableView;

        

        NSMutableArray *_dataArr;

        

        NSMutableData *_downloadData;

    }

     

    @end

     

    @implementation ViewController

     

    - (void)viewDidLoad

    {

        [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

        _dataArr = [[NSMutableArray alloc]init];

        _downloadData = [[NSMutableData alloc]init];

        

        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://itunes.apple.com/cn/rss/topfreeapplications/limit=18/xml"]];

        

        [NSURLConnection connectionWithRequest:request delegate:self];

        

        

        _myTableView = [[UITableView alloc]initWithFrame:self.view.bounds];

        _myTableView.delegate = self;

        _myTableView.dataSource = self;

        [self.view addSubview:_myTableView];

    }

     

    #pragma mark - tableView

     

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    {

        return _dataArr.count;

    }

     

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    {

        return 150;

    }

     

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    {

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"qqq"];

        if (!cell) {

            cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"qqq"] autorelease];

            

            UIImageView *icon = [[UIImageView alloc]initWithFrame:CGRectMake(10, 25, 100, 100)];

            icon.tag = 1;

            [cell.contentView addSubview:icon];

            [icon release];

            

            

            UILabel *detail = [[UILabel alloc]initWithFrame:CGRectMake(120, 10, 190, 130)];

            detail.font = [UIFont systemFontOfSize:14];

            detail.numberOfLines = 0;

            detail.tag = 2;

            [cell.contentView addSubview:detail];

            [detail release];

        }

        

        UIImageView *icon = (UIImageView *)[cell.contentView viewWithTag:1];

        UILabel *detail = (UILabel *)[cell.contentView viewWithTag:2];

        

        GDataXMLElement *app = [_dataArr objectAtIndex:indexPath.row];

        

        GDataXMLElement *iconUrl = [[app elementsForName:@"im:image"] lastObject];

        [icon setImageWithURL:[NSURL URLWithString:iconUrl.stringValue]];

        

        GDataXMLElement *detailElement = [[app elementsForName:@"summary"]lastObject];

        detail.text = detailElement.stringValue;

        

        return cell;

    }

     

    #pragma mark - NSURLConnection

     

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

    {

        _downloadData.length = 0;

    }

     

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

    {

        [_downloadData appendData:data];

    }

     

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection

    {

        GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:_downloadData options:0 error:nil];

        

        GDataXMLElement *root = [doc rootElement];

        

        //在根节点中寻找entry子节点,结果放在数组中

        _dataArr.array = [root elementsForName:@"entry"];

        

        [_myTableView reloadData];

    }

     

    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

    {

        NSLog(@"%s",__func__);

    }

     

    - (void)dealloc

    {

        [_dataArr release];

        [_downloadData release];

        [_myTableView release];

        [super dealloc];

    }

     

    - (void)didReceiveMemoryWarning

    {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

     

    @end

     

     

    让明天,不后悔今天的所作所为
  • 相关阅读:
    LeetCode:33. Search in Rotated Sorted Array
    重拾 ACM-HDU 2000-2009
    hdu 1022 数据结构 stack模拟
    画椭圆
    声控灯
    VC++调用R语言
    Setup Factory打包时注册com dll
    折腾树莓派的一些总结
    老调重弹
    制作cpprefernce.chm
  • 原文地址:https://www.cnblogs.com/-yun/p/4423069.html
Copyright © 2020-2023  润新知