iOS之数据解析之XML解析详解

2020-01-18 18:08:44王振洲


//通过dom解析方式为xml增加节点 (sax只可以读取,不可以添加)
- (void)domAddNote{
  //获得文件路径
  NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"XMLDemo" ofType:@"xml"];
  //将文件转换为data类型
  NSData *xmlData = [NSData dataWithContentsOfFile:xmlPath];

  GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:nil];
  GDataXMLElement *rootElement = [doc rootElement];
  //创建一个我们需要添加的节点(student)
  GDataXMLElement *createElement = [GDataXMLElement elementWithName:@"student"];
  //为student节点添加属性
  [createElement addAttribute:[GDataXMLElement attributeWithName:@"attribute" stringValue:@"aa"]];
  //为student节点添加子节点
  GDataXMLElement *nameNode = [GDataXMLElement elementWithName:@"name" stringValue:@"美丽"];
  [createElement addChild:nameNode];
  GDataXMLElement *ageNode = [GDataXMLElement elementWithName:@"age" stringValue:@"18"];
  [createElement addChild:ageNode];
  GDataXMLElement *sexNode = [GDataXMLElement elementWithName:@"sex" stringValue:@"男"];
  [createElement addChild:sexNode];

  //将创建好的student节点,添加到根节点,也就是students节点下
  [rootElement addChild:createElement];

  //得到所有的student节点
  NSArray *stuElementArray = [rootElement elementsForName:@"student"];

  //遍历得到每个student节点,以便获得student的子节点的值。
  for (GDataXMLElement* item in stuElementArray) {

    //获得student节点的attribute属性值
    NSLog(@"%@",[[item attributeForName:@"attribute"] stringValue]);

    NSArray *nameArray = [item elementsForName:@"name"];
    GDataXMLElement *nameElement = [nameArray objectAtIndex:0];
    NSString *name = [nameElement stringValue];

    //取出age
    NSArray *ageArray = [item elementsForName:@"age"];
    GDataXMLElement *ageElement = [ageArray objectAtIndex:0];
    NSString *age = [ageElement stringValue];
        //取出sex
    NSArray *sexArray = [item elementsForName:@"sex"];
    GDataXMLElement *sexElement = [sexArray objectAtIndex:0];
    NSString *sex = [sexElement stringValue];
    NSLog(@"name=%@---age=%@----sex=%@",name,age,sex);
  }
}

SAX解析

SAX:Simple API for XML,基于事件驱动的解析方式,逐行解析数据(采用协议回调机制). NSXMLParser 

1 NSXMLParser是iOS自带的XML解析类,采用SAX方式解析数据

2 解析过程由NSXMLParserDelegate协议方法回调

3 解析过程:开始标签->取值->结束标签->取值


//遵循协议
@interface rootViewController ()<NSXMLParserDelegate>

//xml解析之sax解析
-(void)xmlSaxMethod{
 //得到需要解析的数据
 NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"XMLDemo" ofType:@"xml"];
 NSData *xmlData = [NSData dataWithContentsOfFile:xmlPath];
 //创建sax解析的工具类对象
 NSXMLParser *saxParser = [[NSXMLParser alloc] initWithData:xmlData];
 //指定代理
 saxParser.delegate = self;
 //开始解析 sax解析是一个同步的过程
 BOOL isParse = [saxParser parse];
 if (isParse) {

   NSLog(@"解析完成");
 }else{
   NSLog(@"解析失败");
 }
 NSLog(@"我是在解析结束下面");
}