XML 的组成语法及解析

前端之家收集整理的这篇文章主要介绍了XML 的组成语法及解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

XML可扩展标记语言

优点:代码的安全性很高,可以很容易的替换模板。
缺点:开发成本太高

组成部分

@H_404_8@
  • 文档声明(在xml文档的最前面,必须写一个文档声明,用来声明xml文档的类型)最常用的文档的字符编码如下
  • <?xml version="1.0" encoding="UTF-8"?>
    @H_404_8@
  • 元素

    一个元素可以嵌套若干个子元素(不能出现交叉嵌套)
    规范的XML文档最多只有一个跟元素,其他元素都是跟元素的子孙元素
    xml中的所有空格和换行,都会当做具体内容来处理

  • 属性

  • XML解析

    DOM:一次将所有的XML文档加载进内存,比较适合解析小文件(对应goole)
    SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析较大的文件(对应苹果原生)

    XML解析方式的选择建议:

    1. 文件:NSXMLParser(苹果原生)
    2. 文件:GdataxML(goole的)

    用GdataxML解析
    导入第三方文件到xcode,配置xcode
    第一步:导入动态库,在 xcode首页 的 General 下面

    第二步:

    第三步:

    第四步:取消GdataxML的arc编译环境,方法同JSONKit的配置

    GDdataxML中常用的类和方法

    1. GdataxMLDocument : 代表整个xml文档
    2. GdataxMLElement : 代表文档中的元素
    3. attributeForName : 元素对象方法,可以获得属性
    4. elementsForName : 元素对象方法,获得这个元素的所有子元素
    5. rootElement : 元素对象方法获取根元素

    相比之下,JSON的体积小于XML,所以服务器返回给移动端的数据格式以JSON居多

    代码举例

    -(void)saxCcick{
        NSString *xmlPath = [[NSBundle mainBundle]pathForResource:@"bookstore" ofType:@"xml"];
        NSURL *url = [NSURL fileURLWithPath:xmlPath];
    
        //创建解析器对象
        NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:url];
        //设置委托
        parser.delegate = self;
    
        if (![parser parse]) {
            NSLog(@"解析失败");
        }
    }
    
    #pragma mark - nsxmlParserDelegate
    
    //解析开始 创建储存对象
    -(void)parserDidStartDocument:(NSXMLParser *)parser{
        _bookArray = [NSMutableArray array];
    }
    
    //解析 开始标签 调用,初始化模型,将元素的属性存储到模型
    -(void)parser:(NSXMLParser *)parser
    didStartElement:(NSString *)elementName
     namespaceURI:(NSString *)namespaceURI
    qualifiedName:(NSString *)qName
       attributes:(NSDictionary *)attributeDict{
        if ([elementName isEqualToString:@"book"]) {
            //初始化模型
            _mode = [BookMode new];
            _mode.category = attributeDict[@"category"];
        }else if ([elementName isEqualToString:@"title"]){
            _mode.lang = attributeDict[@"lang"];
        }else if ([elementName isEqualToString:@"auther"]){
            _mode.author = attributeDict[@"auther"];
        }else if ([elementName isEqualToString:@"year"]){
            _mode.year = attributeDict[@"year"];
        }else if ([elementName isEqualToString:@"price"]){
            _mode.price = attributeDict[@"price"];
        }
    }
    
    //找到元素内容内容暂时存在中间变量,中间变量是动态刷新的
    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        //内容赋给中间变量
        _tempStr = string;
    }
    //解析 结束标签 调用,给模型元素赋值
    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
        if ([elementName isEqualToString:@"book"]) {
            [_bookArray addObject:_mode];//解析到最后把模型加载到数组中
        }else if (![elementName isEqualToString:@"bookstore"]){
            NSLog(@"====key=%@=====value=%@",elementName,_tempStr);
            //kvc
    // if ([elementName isEqualToString:@"id"]) {
    // [_mode setValue:_tempStr forKey:@""];
    // }
            [_mode setValue:_tempStr forKey:elementName];//?????????
    
        }
    }
    
    //文档解析结束调用
    -(void)parserDidEndDocument:(NSXMLParser *)parser{
        NSLog(@"%ld",_bookArray.count);
    }
    
    //文档解析失败调用
    -(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
        NSLog(@"失败");
    }

    猜你在找的XML相关文章