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解析了。哇咔咔
上一篇: XML解析之DOM解析