//使用 GDataXMLNode
/*
DOM解析
特点:将整个 XML 数据 以树形结构形式存入内存中
优点:可以直接定位到指定的位置进行数据读取,快速
缺点:占内存,不能读取大型数据
*/
导入第三方类库 GDataXMLNode
设置配置:
-(void)xmlDOM
{
NSMutableArray *mArray = [NSMutableArray array];
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"book" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
//创建解析工具 GData 对象
GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
//获得树形结构的根节点
GDataXMLElement *rootElement = xmlDocument.rootElement;
//遍历跟节点上的子节点
for (GDataXMLElement *subElement in rootElement.children) {
NSLog(@"%@",subElement);
//每次找到一个节点就创建一个 BookModel 对象
BookModel *model = [BookModel new];
for (GDataXMLElement *element in subElement.children) {
[model setValue:element.stringValue forKey:element.name];
}
[mArray addObject:model];
}
//遍历数组
for (BookModel *model in mArray) {
NSLog(@"title = %@,author = %@,year = %@,price = %@",model.title,model.author,model.year,model.price);
}
}
/*
SAX 解析
特点:逐行解析
优点:不占内存,可以解析大型数据
缺点:效率低,不能解析指定位置的数据
*/
-(void)xmlSAX
{
/*
SAX 解析
特点:逐行解析
优点:不占内存,可以解析大型数据
缺点:效率低,不能解析指定位置的数据
*/
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"book.txt" ofType:nil];
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithData:data];
xmlParser.delegate = self;
//执行解析(手动调用)
[xmlParser parse];
}
#pragma mark ---NSXMLParserDelegate---
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
_dataArray = [NSMutableArray array];
}
//解析标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict
{
//解析标签,当标签为 book 时候,说明当前节点是一个书的信息,找到一个书的信息就创建一个 BookModel 对象
if ([elementName isEqualToString:@"book"]) {
BookModel *model = [BookModel new];
[_dataArray addObject:model];
}
_elementName = elementName;
NSLog(@"elementName = %@",elementName);
}
//读取标签里面的值
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
BookModel *model = [_dataArray lastObject];
[model setValue:string forKey:_elementName];
}
//读取结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
{
_elementName = nil;
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
for (BookModel *model in _dataArray) {
NSLog(@"title = %@,author = %@,year = %@,price = %@",model.title,model.author,model.year,model.price);
}
}