XML数据格式原生解析器

由于服务器早已关闭,在此不能看到效果,只能给大家看一下代码,知道如何解析的了,想必大家都知道XML数据格式长得什么样子吧,在此贴出一点XML数据格式

曹操,50|宁教我负天下人。
孙权,容我三思。
刘备,45,以德服人

xml数据格式    extend mark launage

<friend>

<people>
<name>曹操</name>
<sons>
<son>曹丕</son>
<son>曹冲</son>
</sons>
<age>50</age>
<sign>宁教我负天下人</sign>
</people>

<people>
<name>孙权</name>
<sign>容我三思</sign>
</people>

<people>
<name>刘备</name>
<age>45</age>
<sign>以德服人</sign>
</people>

</friend>

//()代表扩展,()里面有代码就是一个类别
@interface FriendsListVc ()

//@property在.h文件中在其他类中也可以打点使用;@property在.m文件中只有在自己类中使用
@property (nonatomic,retain)People *p;

@end

@implementation FriendsListVc

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    _table.dataSource = self;
    _table.delegate = self;
    _data = [[NSMutableData alloc]init];
    _array = [[NSMutableArray alloc]init];
    _string = [[NSMutableString alloc]init];
    
    NSString *userName = [[NSUserDefaults standardUserDefaults]objectForKey:@"userName"];
    //请求好友列表
    NSString *urlString = [NSString stringWithFormat:@"http://127.0.0.1:8080/A/a?command=2&name=%@",userName];
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    [connection start];
}

#pragma mark- URL
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"失败原因:%@",error);
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [_data setData:[NSData data]];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [_data appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString *string = [[NSString alloc]initWithData:_data encoding:NSUTF8StringEncoding];
    NSLog(@"\n%@",string);
    //xml解析器   创建一个解析器,   parser,语法解析器
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:_data];
    //设置解析代理
    parser.delegate = self;
    //开始解析
    [parser parse];
    [parser release];
    [string release];
}

#pragma mark- XML
//当发现开始标签时调用   element,元素,要素,原理,成分
//step1、发现开始标签,清空原来数据
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"开始标签%@",elementName);
    
    //发现users开始标签时,说明解析开始,需要准备一个空数组用来存放所有好友
    if ([elementName isEqualToString:@"users"])
    {
        [_array removeAllObjects];
    }
    
    //发现user开始标签时,说明解析到了一个好友,需要创建一个People对象表示这个好友
    else if ([elementName isEqualToString:@"user"])
    {
        self.p = [[[People alloc]init]autorelease];
    }
    
    //发现name、tname、email开始标签,需要读取这个好友的name、tname、email字符串,需要准备一个空字符串用于拼接
    else if ([elementName isEqualToString:@"name"]||[elementName isEqualToString:@"tname"]||[elementName isEqualToString:@"email"])
    {
        [_string setString:@""];
    }
}

//发现字符时调用   这个方法可能会多次调用
//step2、发现字符时,将字符拼接到字符串中
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"字符%@",string);
    
    //发现新字符时拼接到_string中
    [_string appendString:string];
    //NSLog(@"拼接了字符%@",_string);
}

//发现结束标签时调用
//step3、发现结束标签时,给其赋值
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"结束标签%@",elementName);
    
    //当发现name结束标签时,说明name拼接完毕,赋值给当前people的name属性
    if ([elementName isEqualToString:@"name"])
    {
        self.p.name = _string;
    }
    else if ([elementName isEqualToString:@"tname"])
    {
        self.p.trueName = _string;
    }
    else if ([elementName isEqualToString:@"email"])
    {
        self.p.email = _string;
    }
    //当发现user结束标签时,说明好友创建完毕,把所有好友加入数组中
    else if ([elementName isEqualToString:@"user"])
    {
        [_array addObject:self.p];
    }
    //当发现users结束标签时,说明解析结束,刷新tableView
    else if ([elementName isEqualToString:@"users"])
    {
        [_table reloadData];
    }
}

#pragma mark- table
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _array.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [_table dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell)
    {
        cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]autorelease];
    }
    
    People *p = [_array objectAtIndex:indexPath.row];
    cell.textLabel.text = p.name;
    cell.detailTextLabel.text = p.email;
    return cell;
}


  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值