虽然现在大多用JSON很少用到XML,但是也是很有必要懂得XML的相关用法,编程的道路是趋向深度和广度的,共勉.
笔者使用NSXMLParser来完成对XML的解析.首先,需要创建NSXMLParser对象.
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData: obj.messageData];
[xmlParser setDelegate:self];
[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser parse];
然后应该实现NSXMLParserDelegate的相应方法,这就根据后台确定的格式来做接下来的工作.这里讲述后台返回的是一个以properties节点开始的包含数组的内容.
在解析开始方法中,遍历获取子节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
_storedAllKeys =YES;
_keyName = elementName;
if ([elementName isEqualToString:@"properties"]) {
_propertiesMark = YES;
}
}
然后寻找数组中对应的子节点内容,比如:name value ,分别为一个用得到属性的键 /值,现在需要获取他们并将其设置为字典类型,因为为数组中提取,所以在一个可变字典类型中添加相应的键/值
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (_storedAllKeys) {
if (_propertiesMark) {
if ([_keyName isEqualToString:@"name"]) {
[_messageParseDic setObject:@"" forKey:string];
_objKey = string;
}else if ([_keyName isEqualToString:@"value"]){
[_messageParseDic setObject:string forKey:_objKey];
}
}
}
}
当数组中每次遍历一次,会执行一次
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullableNSString *)namespaceURI qualifiedName:(nullableNSString *)qName;方法,但是当遍历到对应的数组节点开始对应的结束节点时,就是已执行完全部遍历.接着就应该做相应的工作了.
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
_storedAllKeys = NO;
if ([elementName isEqualToString:@"properties"]) {
_propertiesMark = NO;
_messagedlx.properties = _messageParseDic;
NSString *avatorStr =[ _messagedlx.properties objectForKey:@"from_img "];
_messagedlx.avatarUrl = avatorStr;
[self.chatFakeMessages addObject:_messagedlx];
}
}
总的来说,解析XML主要按照上诉的三个方法,但是具体问题还是要具体对待.