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

xml数据解析

发布时间:2020-12-16 00:24:20 所属栏目:百科 来源:网络整理
导读:在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 plain copy print ?
  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


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

1、didStartElement

2、foundCharacters

3、didEndElement

示例如下:

?
    -(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qNameattributes:(NSDictionary*)attributeDict{
  1. NSLog(@"xml_parserstart%@",elementName);
  2. if([elementNameisEqualToString:@"person"]){
  3. NSLog(@"xml_parserperson");
  4. if(personNameArrary==nil){
  5. personNameArrary=[[NSMutableArrayalloc]init];
  6. }
  7. }
  8. if(itemValue!=nil){
  9. itemValue=nil;
  10. itemValue=[[NSMutableStringalloc]init];
  11. if([elementNameisEqualToString:@"phone"]){
  12. NSString*atr=[attributeDictvalueForKey:@"type"];
  13. NSLog(@"xml_parserphonetype:%@",atr);
  14. -(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string{
  15. NSLog(@"xml_parservalue:%@",string);
  16. [itemValueappendString:string];
  17. -(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qName{
  18. NSLog(@"xml_parserend%@",elementName);
  19. if([elementNameisEqualToString:@"firstName"]){
  20. [personNameArraryaddObject:itemValue];
  21. if([elementNameisEqualToString:@"person"]){
  22. NSLog(@"xml_parserpersonend");
  23. }

(编辑:李大同)

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

    推荐文章
      热点阅读