XML

转载 2016年08月31日 13:39:53

 在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。这篇文章使用了NSXMLParser。

解析 XML 通常有两种方式,DOM 和 SAX:

  • DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
  • SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。

    NSXMLParser是基于SAX的解析方式。NSXMLParser采用了委托设计模式,因此他的实现类需要采用协议并支持委托。NSXMLParser解析XML需要委托NSXMLParserDelegate实现。

1、初始化NSXMLParser

要使用NSXMLParser要先创建它,设置各种属性,主要用到以下几个方法:

initWithContentsOfURL  通过NSURL创建解析器

initWithData                 通过NSData创建解析器

setDelegate                  为解析器定义委托

parse                           运行解析器

  1. NSXMLParser *parser=[[NSXMLParser alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding]];  
  2.    
  3.    NSXMLParser *parser=[[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml"]];  
  4.    
  5.  [parser setDelegate:self];//设置NSXMLParser对象的解析方法代理  
  6.  [parser setShouldProcessNamespaces:NO];  
  7.  [parser parse];//开始解析  

2、委托方法

主要使用一下委托方法:

  1. //发现元素开始符的处理函数  (即报告元素的开始以及元素的属性)   
  2. - (void)parser:(NSXMLParser *)parser   
  3.         didStartElement:(NSString *)elementName   
  4.         namespaceURI:(NSString *)namespaceURI   
  5.         qualifiedName:(NSString *)qName   
  6.         attributes:(NSDictionary *)attributeDict  
  7.   
  8. //处理标签包含内容字符 (报告元素的所有或部分内容)   
  9. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string  
  10.   
  11. //发现元素结束符的处理函数,保存元素各项目数据(即报告元素的结束标记)  
  12. - (void)parser:(NSXMLParser *)parser   
  13.         didEndElement:(NSString *)elementName   
  14.         namespaceURI:(NSString *)namespaceURI   
  15.         qualifiedName:(NSString *)qName  
  16.   
  17. //报告解析的结束   
  18. - (void)parserDidEndDocument:(NSXMLParser *)parser  
  19.   
  20. //报告不可恢复的解析错误  
  21. - (void)paser:parserErrorOccured  


执行[parser parse]后会依序执行:

1、didStartElement

2、foundCharacters

3、didEndElement

示例如下:

  1. -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {  
  2.       
  3.     NSLog(@"xml_parser start %@ ",elementName);  
  4.     if ( [elementName isEqualToString:@"person"] ) {  
  5.         NSLog(@"xml_parser person ");  
  6.         if(personNameArrary==nil){  
  7.             personNameArrary=[[NSMutableArray alloc] init];  
  8.         }  
  9.     }  
  10.   
  11.         if(itemValue!=nil){  
  12.             itemValue=nil;  
  13.         }  
  14.         itemValue=[[NSMutableString alloc] init];  
  15.       
  16.     if ( [elementName isEqualToString:@"phone"] ) {    
  17.         NSString *atr=[attributeDict valueForKey:@"type"];  
  18.         NSLog(@"xml_parser phone type: %@",atr);  
  19.     }  
  20. }  
  21.   
  22. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {  
  23.       
  24.     NSLog(@"xml_parser value:%@",string);  
  25.     [itemValue appendString:string];  
  26. }  
  27.   
  28. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {  
  29.   
  30.     NSLog(@"xml_parser end %@ ",elementName);  
  31.     if ( [elementName isEqualToString:@"firstName"] ) {  
  32.         [personNameArrary addObject:itemValue];  
  33.     }  
  34.       
  35.     if ( [elementName isEqualToString:@"person"] ) {  
  36.         NSLog(@"xml_parser person end");  
  37.     }  
  38.       
  39. }  

application/xml and text/xml的区别

在使用Postman调试接口的时候,raw里面有关于xml传输有 application/xml 和 text/xml 两种方式 ,疑惑? 当你指定编码的时候,使用applicatio...
  • Kan_Auyeung
  • Kan_Auyeung
  • 2016年07月11日 10:10
  • 3371

XML的解析和XML字符串互转的方法

原作者上一共讲述了四中转换XML的方法,但是我觉得方法只要会一种就好,而且是那种最简单的,这个也是软件设计本身的原则,一方面为了软件开发便利,另一方面也对效率方面的要求不是特别高,我自己最喜欢用dom...
  • gengyazhou123
  • gengyazhou123
  • 2016年07月04日 22:08
  • 4914

xml颜色代码表

#00000000    #FFFFFF    #FFFFF0    #FFFFE0    #FFFF00    #FFFAFA    #FFFAF0    #FFFACD    #F...
  • u014096171
  • u014096171
  • 2016年09月01日 16:29
  • 2816

xml嵌套xml时的转移字符

使用场景项目中,数据库升级工具,使用xml格式保存数据库升级脚本,格式如下: UPDATE sysconfig SET strV...
  • xuejianhui
  • xuejianhui
  • 2016年09月18日 17:51
  • 1248

数据库XML数据查询

一、sql Server for xml生成xml for xml是一个行集聚和函数,返回nvarchar(max)的数据类型的单行单列结果集,type指令与for xml一起运用产生xml数据类型...
  • ceclar123
  • ceclar123
  • 2012年09月20日 16:52
  • 2380

XML——XML介绍和基本语法

本文介绍了XML语言的历史,以及它的作用和常见的应用。重点介绍了XML文件的语法规则...
  • ggGavin
  • ggGavin
  • 2016年05月26日 22:31
  • 3438

基础加强第四天 正则表达式和XML

1、资料管理器  private void Form2_Load(object sender, EventArgs e)         {             //文件的根路径     ...
  • qizhichao110
  • qizhichao110
  • 2015年03月23日 17:17
  • 1459

Web安全之XML注入

XML注入攻击,和SQL注入的原理一样,都是攻击者输入恶意的代码来执行自身权限以外的功能。 XML是存储数据的一种方式,如果在修改或者查询时,没有做转义,直接输入或输出数据,都将导致XML注入漏洞。...
  • mevicky
  • mevicky
  • 2015年09月06日 08:36
  • 7369

PHP 创建、增加、删除、修改 xml

创建xml 方法:
  • k8080880
  • k8080880
  • 2015年08月13日 18:03
  • 1856

xml转义符规则

最近在写一个xml解析器,我百度xml转义符被坑过,为了防止更多的人被坑,所以写下这篇博客。 强制要求转义的符号只有两个 &与 1、转义符以 & 开始 2、转义符以 ; 结束 3、大小...
  • Gnorth
  • Gnorth
  • 2017年01月06日 09:30
  • 1009
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XML
举报原因:
原因补充:

(最多只允许输入30个字)