XML 是一种自描述的数据交换格式,但是 XML 的数据交换格式并没有 JSON 来的轻便,但是无可否认的是,XML 的应用范围也是非常广泛的,比如在 ROS(一个开源机器人操作系统)中利用 XML 来描述包的依赖关系等,当然还有很多了。
对于 XML 文档操作包括了“读”与“写”,读入 XML 文档并分析的过程称为“解析” XML 文档,“解析” XML 文档在实际开发中是占很大比重的。
读写 XML 文档,目前流行的有两种模式:SAX 和 DOM 。SAM 是一种基于事件驱动的解析模式。解析 XML 的时候,程序从上到下读取 XML 文档,如果遇到开始标签、结束标签、属性等,就会触发相应的事件,但是这种解析 XML 文件有一个弊端就是只能读取 XML 文档,而不能写入 XML 文档。但是也是有优点的,就是解析速度快,而iOS中推荐使用 SAX 解析模式。
DOM 模式是将 XML 文档作为一棵树状结构来进行分析,提供获取节点的内容,以及相关属性,或是新增、删除和修改节点的内容。 XML 解析器在加载 XML 文件以后,DOM 将 XML 文件的元素视为一个树状结构的节点,一次性读入到内存中。如果文档比较大,解析速度就会比较慢,这是不可避免的。但是 DOM 模式有一点是 SAX 无法取代的,就是 DOM 能够修改 XML 文档。
NSXML
NSXML 是苹果自家默认的解析框架,采用 SAX 模式进行解析。它是 SAX 解析模式的代表。NSXML 框架中的核心是 NSXMLParser 和它的委托协议 NSXMLParserDelegate。主要的解析工作是在委托协议的实现类中完成的,委托中定义了很多回调方法,在 SAX 解析器从上到下遍历 XML 文档的过程中,遇到开始标签、结束标签、文档开始、文档结束和字符串就会触发相关方法。
常用的方法:
(1)parserDidStartDocument --文档开始的时候触发
(2)parser:didStartElement:namespaceURI:qualifiedName:attributes --遇到一个开始标签时开始触发,其中 namespaceURI 部分是命名空间, qualifiedName 是限定名,attributes 是字典类型的属性集合
(3)parser:foundCharacters --遇到字符串时触发
(4)parser:didEndElement:namespaceURI:qualifiedName --遇到结束标签时触发
(5)parserDidEndDocument --遇到文档结束时触发
下面实现一个解析的XMLParser类。
XMLParser.h
#import <Foundation/Foundation.h> @interface XMLParser : NSObject <NSXMLParserDelegate> //开始解析 -(void)start; @endXMLParser.m
-(void)start { NSString* path = [[NSBundle mainBundle] pathForResource:@"Test" ofType:@"xml"]; //解析一个Test.xml文件的文档 NSURL *url = [NSURL fileURLWithPath:path]; //开始解析XML NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; parser.delegate = self; [parser parse]; NSLog(@"解析完成..."); }
如有不足之处还望指出!