数据解析(XML)

1 XML ——DOM解析

  在iPhone开发中,XML的解析有很多选择,iOS的SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三发类库可
  
  共选择,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。
  
  解析 XML 通常有两种方式,DOM 和 SAX:
  
  DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构,(结点树),通过遍历树结构可以检索任意的XML结点,读
  
  取它的属性和值,在通常情况下,可以借助XPath,直接查询XML结点。解析的文档
  
  SAX解析SML时,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当读取到需
  
  要处理的对象,会发出通知对其进行处理。这样这一提高解析效率。可控性强,占用内存小,适用于提取部分数据。解析的
  
  是事件

2. DOM文件导入工程的具体步骤:

   1.从从http://code.google.com/p/gdata-objectivec-client/downloads/list下载“gdata-objective-c client 
   library.”
   
   2.解压缩文件,找到Source\XMLSupport,并且将其中的GDataXMLNode.h 和 GDataXMLNode.m文件拖到项目中
   
   3.选中项目,选中“basic Setting”标签页,进入Build Phases ,然后点击第三个Link binary with libraries。添
   
   加libxml2类库到工程中。
   
   4.将Build Setting页中,顶部的“Basic”标签切换成ALL
   
   5.找到Paths\Header Search Paths"项,并添加“/user/include/libxml2”到列表中
   
   6. 找到”Linking\Other Linker Flags“,并添加”-lxml“到列表中。
   
   7.在头文件中调用GDataXML的代码文件,加入。
   
3. 解析的具体步骤:(本地文件)

   //1.首先获取文件的路径
   NSString *filepath = [[NSBundle mainBundle] pathForResource:@"text" ofType:@"xml"];
   
   //2.读取数据
   NSData *data = [[NSData alloc]initWithContentOfFile:filepath];
   
   //3.创建解析对象
   GDataXMlDoucement *xmldoucement = [[GDataXMLDoucement alloc]initWithData:data options:0 error:nil];

   //4.获取根节点
   GDataXMLELement *rootElment = xmldoucement,rootElement;
   
   //准备初始化数组
    self.dataarry = [NSMutableArray array];
    
    //5.获取总数
    for (GDataXMLElement *children in rootElement.children)
    {
        dataModel *m = [[dataModel alloc]init];
        for (GDataXMLElement *value in children.children)
        {
            //准备modol类储存
            //stringValue是标签中的值, name是标签名字
            [m setValue:value.stringValue forKey:value.name];
        }
        [self.dataarry addObject:m];
    }
    
2. XML的SAX解析

   用苹果系统自带的解析工具必须要遵循NSXMLParserDelegate
   
   1. 获取目标文件的路径
   NSString *filePath = [NSBundle mainBundle] pathForResource:@"name" ofType:"txt"];
   
   2.读取数据
   NSData *data = [[NSData alloc]initWithContentOfFile:filePath];
   
   3.创建XMLParse的解析对象
   NSXMLPaser *xmlPaser = [NSXMLPaser alloc]initWithData:data];
   
   4.设置代理,开始解析
   xmlPaser.delegate = self;
   
   [xmlPaser parse]
   
   开始解析文档
   -(void)parseDidStartDoucement:(NSXMLParser *)parser
   {
      self.dataarr = [NSMutableArray array];
   }
   //开始解析标签
   - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
   {
      //记录当前的标签
      self.currentElementName = elementName;
      //初始化字符串
      self.str = [NSMutableString string];
      //判断是否读到标签
      if([elementName isEqualToString:"message"])
      {
          dataModel *model = [dataModel alloc]init];
          
          [self.dataarr addObject:model];
      }
   }
   
   //取出解析的值
   - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
   {
      [self.str appendString:string];
   }
   
   //4.结束解析
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    //取数组中的最后一个元素
    dataModel *temp = [_dataarry lastObject];
    //KVC
    [temp setValue:_str forKey:_currentElementName];
    _currentElementName = nil;
}
//5.结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    for (dataModel *m in _dataarry)
    {
        NSLog(@"%@:%@:%@:%@",m.receiver,m.sender,m.date,m.content);
    }
}

//6.防止错误
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@"写错了");
}



你可能感兴趣的:(数据解析(XML))