码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 开发指南 第15章 访问Web Service之数据交换格式

时间:2015-09-19 18:21:03      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

 “自描述的”结构化文档 

1 XML文档结构

   声明:定义了XML文件的版本和使用的字符集 <>

   根元素:开始标签  结束标签

   子元素:开始标签 结束标签

   属性:  定义在开始标签中 属性名 属性值(放置在双引号或单引号之间) 一个元素不能有多个名字相同的属性。

   命名空间:为XML文档提供名字唯一的元素和属性

************

XML 命名空间提供避免元素命名冲突的方法。

XML Namespace (xmlns) 属性

XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:

xmlns:namespace-prefix="namespaceURI"

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

**************

  限定名:定义了元素和属性的合法标示符,用作特定元素或属性的引用

2 解析XML文档之使用NSXML 

   默认的解析框架,采用基于事件驱动SAX模式解析,遇到标签和属性时会触发相应事件,只能读取不能修改。

   核心是NSXMLParser和NSXMLParserDelegate

   方法:parserDidStartDocument:文档开始的时候触发

           parser:didStartElement:namespaceURI:qualifiedName:attributes:遇到开始标签时触发

           parser:foundCharacters:遇到字符串时触发 触发字符包括换行符和回车符

           parser:didEndElement:namespaceURI:qulifiedName:遇到结束标签时触发

           parserDisEndDocument:文档结束时触发 解析完成 清理变量 返回数据给表示层

   解析器类代码:

 NSXMLParser是解析类 构造器-initWithContentOfURL:-initWithData:-initWithStream:

-(void)start
{
    NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"xml"];
    
    NSURL *url = [NSURL fileURLWithPath:path];另一个是urlWithString:
    //开始解析XML
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    parser.delegate = self;
    [parser parse];
    NSLog(@"解析完成...");
}

//文档开始的时候触发
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    _notes = [NSMutableArray new];初始化,为了装载解析好的数据
}

//文档出错的时候触发
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@"%@",parseError);
}

//遇到一个开始标签时候触发
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict属性字典
{
    _currentTagName = elementName;标记当前解析器的位置
    if ([_currentTagName isEqualToString:@"Note"]) {
        NSString *_id = [attributeDict objectForKey:@"id"];值是1.2.3.4
        NSMutableDictionary *dict = [NSMutableDictionary new];
        [dict setObject:_id forKey:@"id"];
        [_notes addObject:dict];
    }
    
}

//遇到字符串时候触发
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    //替换回车符和空格
    string =[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    if ([string isEqualToString:@""]) {
        return;
    }
    NSMutableDictionary *dict = [_notes lastObject];按照XML上下顺序解析的,所以这里正确
    
    if ([_currentTagName isEqualToString:@"CDate"] && dict) {
        [dict setObject:string forKey:@"CDate"];
    }
    
    if ([_currentTagName isEqualToString:@"Content"] && dict) {
        [dict setObject:string forKey:@"Content"];
    }
    
    if ([_currentTagName isEqualToString:@"UserID"] && dict) {
        [dict setObject:string forKey:@"UserID"];
    }
}

//遇到结束标签时候出发
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName;
{
    self.currentTagName = nil;
}


//遇到文档结束时候触发 解析完成,将数据返回表示层,清理变量
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil];
    self.notes = nil;
}

3 解析XML文档之使用TBXML

  采用DOM模式,第三方框架

  准备:下载TBXML并压解,添加TBXML所依赖的框架和库Foundation.framework UIKit.framework CoreGraphics.framework libz.dylib

           添加工程预编译头文件MyNotes-Prefix.pch 代码为

#ifndef MyNotes_PrefixHeader_pch
#define MyNotes_PrefixHeader_pch
#import <Foundation/Foundation.h>
#define ARC_ENABLED

#endif

           将文件配置到工程中:TARGETS-Build Settings-Apple LLVM 6.0 Language-Prefix Header 输入刚才创建的文件名

解析开始:TBXML类对象构造器 -initWithString:error:-initWithXMLData:error:适合网络通信解析 -initWithXMLFile:error:

 

//开始解析
-(void)start
{
    _notes = [NSMutableArray new];
    构造器
    TBXML* tbxml = [[TBXML alloc] initWithXMLFile:@"Notes.xml" error:nil];
    获得文档的根元素对象
    TBXMLElement * root = tbxml.rootXMLElement;
    
    // if root element is valid
    if (root) {
        
        TBXMLElement * noteElement = [TBXML childElementNamed:@"Note" parentElement:root];
        
        while ( noteElement != nil) {
            
            NSMutableDictionary *dict = [NSMutableDictionary new];
            
            TBXMLElement *CDateElement = [TBXML childElementNamed:@"CDate" parentElement:noteElement];
            if ( CDateElement != nil) {
                NSString *CDate = [TBXML textForElement:CDateElement];
                [dict setValue:CDate forKey:@"CDate"];
            }
            
            TBXMLElement *ContentElement = [TBXML childElementNamed:@"Content" parentElement:noteElement];
            if ( ContentElement != nil) {
                NSString *Content = [TBXML textForElement:ContentElement];
                [dict setValue:Content forKey:@"Content"];
            }
            
            TBXMLElement *UserIDElement = [TBXML childElementNamed:@"UserID" parentElement:noteElement];
            if ( UserIDElement != nil) {
                NSString *UserID = [TBXML textForElement:UserIDElement];
                [dict setValue:UserID forKey:@"UserID"];
            }
            
            //获得ID属性
            NSString *_id = [TBXML valueOfAttributeNamed:@"id" forElement:noteElement error:nil];
            [dict setValue:_id forKey:@"id"];
            
            [_notes addObject:dict];
            
            
            noteElement = [TBXML nextSiblingNamed:@"Note" searchFromElement:noteElement];
            
        }
    }
    
    NSLog(@"解析完成...");
    
    [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil];
    self.notes = nil;
    
}

4 JSON文档结构

   对象:“名称-值”对集合,类似于字典类型,{。。:。。,。。:。。,。。:。。},名称要用双引号括起来

   数组:值的有序集合,[,,,,],值可以是双引号扩起来的任意对象 字符串,结构可以嵌套

5 JSON数据解析 NSJSONSerialization  

 

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"];
    NSData *jsonData = [[NSData alloc] initWithContentsOfFile:path];
    
    NSError *error;
    options指定了解析JSON的模式 枚举NSJSONReadingOptions:MutableContainers指定解析返回的是可变的数组或字典 MutableLeaves指定叶节点是可变字符串 AllowFragments指定顶级节点可以不是数组或字典
id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error]; if (!jsonObj || error) { NSLog(@"JSON解码失败"); } self.objects = [jsonObj objectForKey:@"Record"]; }

 



          

iOS 开发指南 第15章 访问Web Service之数据交换格式

标签:

原文地址:http://www.cnblogs.com/haugezi/p/4821811.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!