加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML解析

发布时间:2020-12-16 05:42:22 所属栏目:百科 来源:网络整理
导读:在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。 这篇文章使用了NSXMLParser。 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,

在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 运行解析器

[cpp]view plaincopyprint?
  1. NSXMLParser*parser=[[NSXMLParseralloc]initWithData:[xmldataUsingEncoding:NSUTF8StringEncoding]];
  2. NSXMLParser*parser=[[NSXMLParseralloc]initWithContentsOfURL:[NSURLURLWithString:@"http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml"]];
  3. [parsersetDelegate:self];//设置NSXMLParser对象的解析方法代理
  4. [parsersetShouldProcessNamespaces:NO];
  5. [parserparse];//开始解析

2、委托方法

主要使用一下委托方法:

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


// xml文件的样式 的样式有多种样式,标准的是把数据存放在子节点中,还有就是比较简单的读取就是把数据直接存在属性里面

// 第一种,这是自己写出来的一种,把数据存储在子节点中,读取相对麻烦一些

IOS<wbr></p>XML数据的解析


// 第二种是从中国气象网的api上街区出来的一段,是把数据存储在了属性中,比较容易读取数据

IOS<wbr></p>XML数据的解析

// 下面是解析第一种样式的代码:
// 头文件

#import

@interfaceRootViewController :UIViewController<</span>NSXMLParserDelegate>

#pragma mark -声明--属性

@property(nonatomic,retain)NSMutableArray*messageeListArray;//数据存储的地方

@property(nonatomic,retain)NSString*fromTagFlag;开始标签

@end


// 实现文件
#import"RootViewController.h"

@interfaceRootViewController()

@end

@implementationRootViewController

- (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil

{

self= [superinitWithNibName:nibNameOrNilbundle:nibBundleOrNil];

if(self) {

// Custom initialization

}

return self;

}


- (void)viewDidLoad

{

[superviewDidLoad];


//获取xml字符串类型文件名

*xmlDocPath = [[NSBundlemainBundle]pathForResource:@"document"ofType@"xml"];

//把字符串类型的网址转为NSURL类型

NSURL*url =[[NSURLalloc]initFileURLWithPath:xmlDocPath];


//使用url实例化网络请求实例

NSURLRequest*request = [NSURLRequestrequestWithURL:url];

//同步读取到网络上的数据

NSData*urlData = [NSURLConnectionsendSynchronousRequest:requestreturningResponse:nilerrornil];

//实例化一个具体的解析类对象

NSXMLParser*xmlParser = [[NSXMLParserinitWithData:urlData];


//设置该解析类对象的代理

xmlParser.delegate=self;

//调用方法开始解析xml文件

[xmlParserparse];

}


#pragma mark - NSXMLParser Delegate -

#pragma mark文档开始读取

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

//实例化存储数据的数组

self.messageeListArray= [NSMutableArrayarray];

}

#pragma mark解析标签开始

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

//首先用属性fromTagFlag获取ElementName,供后面使用

self.fromTagFlag= elementName;

//判断

if([elementNameisEqualToString:@"Message"]) {

NSString*identifier = [attributeDictobjectForKey:@"id"];

NSMutableDictionary*oneDic = [NSMutableDictionarydictionary];

[oneDicsetObject:identifierforKey:@"id"];

[messageeListArrayaddObject:oneDic];

}

}

#pragma mark获取到标签对应的数据

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

//剔除获取的文本中空格和换行

string = [stringstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];

NSMutableDictionary*dict = [.lastObject];

//判断from标签

if([_fromTagFlag@"from"] && dict) {

[dictsetObject:string@"from"];

}

//判断CDate标签

@"CDate"] && dict) {

[dict@"CDate"];

}

//判断Content标签

@"Content"] && dict) {

[dict@"Content"];

}

}

#pragma mark -解析标签结束

- (NSXMLParser*)parser didEndElement:(NSString*)qName {

.fromTagFlag=;

}

#pragma mark文档结束读取

- (void)parserDidEndDocument:(//打印获取到的数据的数组

NSLog(@"%@");

}



#pragma mark -重写----dealloc方法

- (void)dealloc {

[_messageeListArrayrelease],_messageeListArray;

[_fromTagFlag;

//调用父类的dealloc方法

[dealloc];

}

@end

// 第二种xml样式解析的代码
// 头文件

#import

<</span>NSXMLParserDelegate>

#pragma mark -声明--属性

数据存储的地方

开始标签

@end


// 实现文件
];


//准备网址的字符串数据

*urlString =@"http://flash.weather.com.cn/wmaps/xml/beijing.xml";

//把字符串类型的网址转为NSURL类型

NSURL*url1 = [[initWithString:urlString];

requestWithURL:url1];

fromTagFlag= elementName;

//因为数据都是存储在属性中的,全都存储在了attributeDict里面了,在这里直接打印下

NSLog(@"%@",attributeDict);

}

// 因为数据都存储在了属性中,所有不需要解析子标签

}

dealloc];

}


@end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读