欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

xml数据解析--DOM解析

程序员文章站 2022-05-29 08:20:11
...

** xml格式,是前端与后台进行数据交换的时候,使用的一种数据格式,我目前知道的xml解析 有两种形式,SAX(Simple API for XML) 解析和DOM(Document Object Model解析**
下面主要说一下DOM解析的方式,对于数据量不是特别大的xml数据来说,使用这种方式来说比较简单一点。
1.先要导入两个头文件 GDataXMLNode.h、GDataXMLNode.m文件,大家可以自行百度下载。然后就是要你要解析的xml数据,可以是本地文件,也可以是网络的URL。
这是我准备的xml文件

<?xml version="1.0" encoding="utf-8"?> 
<students>
 <student attribute = "草丛三基友老大">
  <name>盖伦</name>
  <sex>男</sex>
  <age>14</age>
 </student>
 <student attribute = "草丛三基友老二">
  <name>赵信</name>
  <sex>随条件改变</sex>
  <age>17</age>
 </student>
</students>

2.以下是解析的方法

- (void)domParser{
   //先要得到xml数据的文件,此处是从本地project读取的
   NSString *xmlPath = [[NSBundle mainBundle]pathForResource:@"XMLFile" ofType:@"xml"];
   //将文件转换为NSData类型
   NSData *data = [NSData dataWithContentsOfFile:xmlPath];
   //将NSData类型的对象,转换为树形结构doc(DOM解析,一次读取全部xml文件,生成一棵节点树)
   GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
   //得到根节点
   GDataXMLElement * rootElement = [doc rootElement];
   
   //第一种方式得到根节点的所有子节点 根据 标签名寻找对应子节点,例如在此处要得到student这个节点
   NSArray *stuElementArray = [rootElement elementsForName:@"student"];

   //第二种方式得到根节点的所有子节点    
   NSArray *childrenArray =  rootElement.children;     
   
   
   //然后我们再得到student节点的所有子节点,比如name节点,age节点  (遍历保存student节点的数组)
   for (GDataXMLElement *itemElement in stuElementArray) {
       
       
       NSArray *nameElement = [itemElement elementsForName:@"name"];
       NSString *name = [[nameElement objectAtIndex:0] stringValue];
       
       NSArray *sexElement = [itemElement elementsForName:@"sex"];
       NSString *sex = [[sexElement objectAtIndex:0] stringValue];
       
       NSArray *ageElement = [itemElement elementsForName:@"age"];
       NSString *age = [[ageElement objectAtIndex:0] stringValue];
       
       //解析出来的值,按照标签,存入字典中
       NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:name,@"name",sex,@"sex",age,@"age", nil];
     //self.mArray 是声明的的一个属性
       [self.mArray addObject:dic];
 
   }
   //得到所有student节点信息后,我们就可以使用了!
   NSLog(@"%@",self.mArray);
 }
}

然而,我们还可以通过DOM的方式来进行更好玩的东西,它可以为xml数据增加节点

  //还是用的上面的xml数据
GDataXMLElement *rootElement = [doc rootElement];
    //创建一个我们需要添加的节点
    GDataXMLElement *createElement = [GDataXMLNode elementWithName:@"student"];
    GDataXMLElement *nameNode = [GDataXMLElement elementWithName:@"name" stringValue:@"金鹏"];
    GDataXMLElement *ageNode = [GDataXMLElement elementWithName:@"age" stringValue:@"11"];
    GDataXMLElement *sexNode = [GDataXMLElement elementWithName:@"sex" stringValue:@"男"];
    GDataXMLElement *phoneNode = [GDataXMLElement elementWithName:@"phone" stringValue:@"111"];
    
    [createElement addChild:nameNode];
    [createElement addChild:ageNode];
    [createElement addChild:sexNode];
    [createElement addChild:phoneNode];
    
    [rootElement addChild:createElement];

上面的方式是用来为一个根节点增加子节点

有一种情况下,我们没有很明显的<students></students>这样的根节点,而是许多的平级节点,而且有可能这些平级节点的名字都不相同,当我们要解析的时候,采用DOM需要一个根节点,所以这个时候,我们可以给xml数据增加一个根节点,至于方法呢?很简单,

[NSString stringWithFormat:@<rootNode>%@</rootNode>",yourXMLstring];

这样,我们就可以愉快的使用DOM解析了。哇咔咔