XML的DOM、Sax解析
XML的DOM、Sax解析
iOS赵师顺 发表于1年前
XML的DOM、Sax解析
  • 发表于 1年前
  • 阅读 18
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

摘要: DOM适于解析比较简单的XML而SAX则适于解析较复杂的XML文件。各有各的好。 DOM和SAX的不同: 1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。而SAX是基于事件的。当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间。 2. DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据。这也是SAX的一个缺点。 3.SAX的另一个缺点:DOM我们可以指定要访问的元素进行随机访问,而SAX则不...

#import "Student.h"

#import "GDataXMLNode.h"

 

 

@interface ViewController ()<NSXMLParserDelegate>

{

    NSString *_recordElementName;

}

 

@property   (nonatomic,strong)NSMutableArray *XMLDomArray;

@property   (nonatomic,strong)NSMutableArray *XmlSAXArray;

 

@end

 

@implementation ViewController

- (void)viewDidLoad {

 [super viewDidLoad];

    

    // 注意使用

1、找到“Paths\Header Search Paths”项,并添加“/usr/include/libxml2”到列表中

2、找到“Linking\Other Linker Flags”项,并添加“-lxml2”到列表中

3、需要在Build Phases->CompileSorces ->双击GDataXMLNode.m,添加-fno-objc-arc

    [self XMLDom];

    [self XMLSax];

}

#pragma mark - XML的DOM解析

 

- (void)XMLDom{

    _XMLDomArray = [[NSMutableArray alloc]init];

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

    NSData *data = [NSData dataWithContentsOfFile:path];

    

    NSError *error = nil;

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

//    取出xml的根节点

    GDataXMLElement *root = document.rootElement;

//   取出xml根节点下的所有子节点

    NSArray *rootChile = root.children;

    

    for (GDataXMLElement *child in rootChile) {

        

        GDataXMLElement *nameElement = [[child elementsForName:@"name"]objectAtIndex:0];

        NSString *name = [nameElement stringValue];

        NSLog(@"%@",name);

        GDataXMLElement *ageElement = [[child elementsForName:@"age"]objectAtIndex:0];

        NSString *age = [ageElement stringValue];

        NSLog(@"%@",age);

        

    }

    

}

 

#pragma mark - XML的SAX解析

 

- (void)XMLSax{

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

    // 将数据转换成二进制的nsdata

    NSData *data = [NSData dataWithContentsOfFile:path];

    // 系统提供的一个雷用来解析nsdata

    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];

    // 相关属性

    // 设置是否处理命名空间的(版权问题)

    [parser setShouldProcessNamespaces:NO];

    // 设置是否回报空间的处理结果

    [parser setShouldReportNamespacePrefixes:NO];

    

    parser.delegate = self;

    

    // 开始解析

    

    [parser parse];

    

    // 代理方法

    

}

 

#pragma mark-----打开文档

 

-(void)parserDidStartDocument:(NSXMLParser *)parser{

    // 打开文档只执行一次

    self.XmlSAXArray = [NSMutableArray array];

}

 

#pragma mark------打开标签

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

    // 在每次打开标签的时候,记录标签 在取值时用来判断

    

    _recordElementName = elementName;

    

    if ([_recordElementName isEqualToString:@"student"]) {

        Student *stu = [[Student alloc]init];

        [self.XmlSAXArray addObject:stu];

    }

    

}

 

#pragma mark-----取值

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    

    // 每次都是先打开标签创建模型存入数组,在取值,每次去的都是最后一个值

    Student *stu = self.XmlSAXArray.lastObject;

    

    if ([_recordElementName isEqualToString:@"name"]) {

        stu.name = string;

    }

}

#pragma mark----关闭标签

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

    _recordElementName = nil;

    //XML的SAX解析方式是  打开标签——》取值——》关闭标签——》取值

    // 通过声明一个标签的实例变量 进行判断,防止将以前的数据覆盖

}

 

#pragma mark-----关闭文档

-(void)parserDidEndDocument:(NSXMLParser *)parser{

    

    for (Student *stu in self.XmlSAXArray) {

        NSLog(@"%@",stu);

    } 

}

 

#pragma mark - xml文档

<Students>

    

    <student>

        <name>张三</name>

    </student>

    

    <student>

        <name>李四</name>

    </student>

  #pragma mark-简历Student类

.h

#import <Foundation/Foundation.h>

@interface Student : NSObject

 

@property(nonatomic,copy)NSString *name;

@property(nonatomic,copy)NSString *sex;

@property(nonatomic,copy)NSString *age;

 

@end

  

    <student>

        <name>王二</name> 

    </student>

 

</Students>

 

 

共有 人打赏支持
粉丝 4
博文 70
码字总数 33551
×
iOS赵师顺
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: