SAX解析

在iOS开发过程中经常用到数据的解析,在这里我想介绍的是对XML数据的解析,XML解析方法有两种,第一种是SAX解析,第二种是DOM解析


一下是一个XML文件内容:

<root>

    <section>

        <bigdictionary>

            <group>A</group>

            <array>

                <stu>

                    <name>安以轩</name>

                    <sex></sex>

                </stu>

                <stu>

                    <name>安又琪</name>

                    <sex></sex>

                </stu>

            </array>

        </bigdictionary>

        <bigdictionary>

            <group>B</group>

            <array>

                <stu>

                    <name>不知道</name>

                    <sex></sex>

                </stu>

            </array>

        </bigdictionary>

        <bigdictionary>

            <group>C</group>

            <array>

                <stu>

                    <name></name>

                    <sex>未知</sex>

                </stu>

            </array>

        </bigdictionary>

    </section>

</root>

在这儿讲一下SAX解析。

SAX解析:

SAX解析是一种逐行解析的过程,不想DOM解析和JSON解析,DOM解析和JSON解析都是系统把XML文件和JSON文件全部读取之后解析的,所以JSON一般用在轻量级的数据中。解析时我们必须完全了解XML文件的结构,然后才能按照XML的格式把数据存放到容器(数组,字典)内

SAX解析中,我们用到一个类NSXMLParser

先签订协议,因为解析时需要NSXMLParser类的协议的方法

@interface XmlParsar ()<NSXMLParserDelegate>


// 解析之后我们把数据存放在一个大数组内

@property (retainnonatomicNSMutableArray *bigArray;

// 解析时我们需要用一个字符串传值

@property (copy, nonatomic) NSString *string;


@end



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

    // 根据路径获取文件

    NSData *data = [NSData dataWithContentsOfFile:path];

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

    // 设置代理人

    xmlParser.delegate = self;

    // 开始解析,必须先设置代理人之后开始解析

    [xmlParser parse];

    [xmlParser release];


// SAX解析中,如果碰到开始节点,则走start方法,每碰到一次就走一次

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

{

    if ([elementName isEqualToString:@"bigdictionary"]) {

        NSMutableArray *array = [NSMutableArray array];

        NSMutableDictionary *bigDic = [NSMutableDictionary dictionary];

        [bigDic setObject:array forKey:@"array"];

        [_bigArray addObject:bigDic];

    } if ([elementName isEqualToString:@"stu"]) {

        NSMutableDictionary *dic = [NSMutableDictionary dictionary];

        [[[_bigArray lastObject] objectForKey:@"array"] addObject:dic];

    }

}


// 如果内容在两个标签中间,则需要在结束标签中标记是哪个标签的内容,并取值

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

{

    if ([elementName isEqualToString:@"group"]) {

        [[_bigArray lastObject] setObject:_string forKey:@"group"];

    }

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

        [[[[_bigArray lastObject] objectForKey:@"array"] lastObject] setObject:_string forKey:@"name"];

    } if ([elementName isEqualToString:@"sex"]) {

        [[[[_bigArray lastObject] objectForKey:@"array"] lastObject] setObject:_string forKey:@"sex"];

    }


}


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

{

    self.string = string;

}


我们可以把上面的代码封装起来,然后通过协议传值,解析完成后把容器内的内容传到相应的页面

你可能感兴趣的:(解析,sax,ios开发)