Xml数据解析的基本数据流程

iOS开发过程中,我们经常会使用web service从服务器上获取数据,而数据格式多以json和xml为主,今天我们就xml的解析流程做以简单的分析。

首先,我们需要初始化一个NSXMLParser的实例parser用以解析xml数据,并且设置parser的delegate,然后就可以开始解析xml数据,解析的过程中通常主要回调以下几个函数:

1、- (void)parserDidStartDocument:(NSXMLParser *)parser;

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

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

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

    NSLog(@"endElement=%@",elementName);

}

5- (void)parserDidEndDocument:(NSXMLParser *)parser;

以上5个是在解析过程中来回调用的函数,我们可以以一个最简单的xml来开始分析:

例如:

<?xml version="1.0" encoding="UTF-8"?>


<liuyunpeng>ok</liuyunpeng>


我们可以将这个过程看作是xml解析器在解析一份数据,当xmlParser开始解析的时候,函数1就会被调用,然后xmlParser会继续解析,然后当其解析到一个标签(<huanghao>)的时候,函数2就会被调用,接下来,解析器就会试图读取标签中的内容,此时函数3就会被调用,读取标签后(ok)的内容,读取完之后,解析器就会试图去寻找其结束标签(</liuyunpeng>),找到之后,函数4就会被调用,然后解析器会继续解析,当他发现没有内容可以解析的时候,解析也就结束了,函数5就会被调用以上就是最基本的xml解析流程。

然而,再实际的过程中我们往往会处理更复杂的xml结构,但其大致流程都是一致的,下面以一个复杂一点的xml结构为例:

>

<?xml version="1.0" encoding="UTF-8"?>


<liuyunpeng>

    <images>

      <id>0</id>

      <name>hottub1</name>

      <image>hottub-1.png</image>

      <artist>bluehost</artist>

    </images>

    <images>

      <id>1</id>

      <name>hottub2</name>

      <image>hottub-2.png</image>

      <artist>bluehost</artist>

    </images>

    <images>

      <id>2</id>

      <name>hottub3</name>

      <image>hottub-3.png</image>

      <artist>bluehost</artist>

    </images>

</liuyunpeng>

同样的,当解析器开始解析的时候,函数1就会被调用,接下来,解析器会继续解析,当他发现一个标签的时候(<liuyunpeng>),函数2就会被调用,然后解析器会试图读取标签(<liuyunpeng>)后的字符,此时就会有不同的分支:如果读取到了字符,那么接下来的流程就会像上面一样,否则,解析器就会继续解析,如果又读取到了标签(<images>),函数2就会再次被调用,然后解析器会试图读取标签后的内容,此时函数3会被调用,接下来同样会分成两个分支:如果读取到了,解析器就会试图找到其结束标签,此时函数4就会被调用,然后<images>节点就解析结束了,解析器会继续寻找结束标签</liuyunpeng>,然后他会读取到又一个<images>标签,然后就会继续解析该标签中的内容,而对于此例来讲,当解析器读到<images>标签时,会试图读取标签后的内容,此时函数3被调用,当然,他不会读取到任何字符,在继续读的过程中他会再一次读取到一个标签<id>,这时他会试图去读取标签后的内容,函数3被调用,读取到字符之后,他会继续解析,此时读取到结束标签</id>,函数4会被调用,然后,解析器会继续解析,因为仍然在<images>标签中,接下来他会试图读取结束标签,如果没有找到,他会继续调用函数3,接下来的步骤其实就是在函数2,3,4中不断的执行,直到解析到最外层节点解析完成,最后解析器发现没有内容可以解析了,解析过程就结束了,函数5就会被调用。

总之,解析过程的原则就是:解析器开始解析(函数1),如果解析到节点(函数2),就解析节点中的字符(函数3),如果没有字符,就继续解析(函数2),如果有字符,就继续解析,解析到节点结束标签(函数4),此节点就解析完成,然后继续解析,在函数2,3,4之间不断的来回执行,直至整个xml数据解析完成,调用函数5。

以上整个流程就是iOS中解析xml数据的基本流程。通常解析出来的数据我们需要一个实体类来保存解析出来的数据。


你可能感兴趣的:(xml,utf-8,ios开发,encoding)