1.原生:NSXMLParser(SAX形式解析)
SAX:一次性将整个XML加载进内存中,适合小文件解析
2.第三方框架:GDataXML(DOM形式解析, 非arc) libxml2(纯c)
DOM:从根元素开始解析,一个一个按顺序解析元素,适合大文件解析
NSXMLParser解析
//4.1 创建一个解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//4.2 设置代理
parser.delegate = self;
//4.3 开始解析
[parser parse];
prama mark ---- NSXMLParserDelegate
//1.开始解析XML文档
-(void)parserDidStartDocument:(nonnull NSXMLParser *)parser
{
NSLog(@"parserDidStartDocument");
}
//2.开始解析XML中某个元素的时候调用,比如<video>
-(void)parser:(nonnull NSXMLParser *)parser didStartElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(nonnull NSDictionary<NSString *,NSString *> *)attributeDict
{
NSLog(@"didStartElement---%@---%@",elementName,attributeDict);
if ([elementName isEqualToString:@"videos"]) {
return;
}
//字典转模型
// XMGVideo *video = [[XMGVideo alloc]init];
// video.keyValues = attributeDict;
XMGVideo *video = [XMGVideo objectWithKeyValues:attributeDict];
[self.videos addObject:video];
}
//3.当某个元素解析完成之后调用,比如</video>
-(void)parser:(nonnull NSXMLParser *)parser didEndElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
{
NSLog(@"didEndElement---%@",elementName);
}
//4.XML文档解析结束
-(void)parserDidEndDocument:(nonnull NSXMLParser *)parser
{
NSLog(@"parserDidEndDocument");
}
GDataXML解析
GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];
//4.2 获取XML文档的根元素,根据根元素取出XML中的每个子元素(所有名称为video的子元素)
NSArray * elements = [doc.rootElement elementsForName:@"video"];
//4.3 取出每个子元素的属性并转换为模型
for (GDataXMLElement *ele in elements) {
XMGVideo *video = [[XMGVideo alloc]init];
video.name = [ele attributeForName:@"name"].stringValue;
video.length = [ele attributeForName:@"length"].stringValue.integerValue;
video.url = [ele attributeForName:@"url"].stringValue;
video.image = [ele attributeForName:@"image"].stringValue;
video.ID = [ele attributeForName:@"id"].stringValue;