IOS 使用第三方框架(DOM)解析XML(GDataXML)

来源:互联网 发布:网络编辑是做什么的 编辑:程序博客网 时间:2024/05/20 02:54

DOM解析:一次性加载文档之后再解析.(1.获得 DOM对象  2.获得根元素内容3.遍历根元素的"属性数组"或者"子元素数组"4.层层遍历元素或者属性内容...5.根据节点的 name属性 stringValue属性获得对应的值6.给数据模型赋值)


使用第三方框架 

GDataXML

需要添加动态库  libxml




需要配置一些系统setting 

// libxml includes require that the target Header Search Paths contain

//

//   /usr/include/libxml2

//

// and Other Linker Flags contain

//

//   -lxml2


如果想在ARC 模式下使用,需要把对应的文件 调成可兼容MRC模式



解析带属性的 XML


// 加载网络数据.// urlString :网络接口!-(void)loadServerDataWithUrlString:(NSString *)urlString{    // 1.创建请求    NSURL *url = [NSURL URLWithString:urlString];        NSURLRequest *request = [NSURLRequest requestWithURL:url];        // 2.发送请求    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {                // 一般在网络开发中,必须处理错误机制!        if (data && !error) {            // 调试            // NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);                        // XML文档特点: 需要的数据都在 属性中.需要 属性名称和属性内容!            // DOM 解析.一次性获得整个 XML 文档, 利用 DOM 操作整个XML节点!                        [self domTestWithData:data];                        // 注意: 数据解析结束之后,记得刷新数据源!            dispatch_async(dispatch_get_main_queue(), ^{                                [self reloadData];            });        }else        {            NSLog(@"网络连接错误...");        }    }] resume];    }// DOM解析- (void)domTestWithData:(NSData *)data{    // 1.获得 DOM 对象!    GDataXMLDocument *dom = [[GDataXMLDocument alloc] initWithData:data options:0 error:NULL];        // 2.利用 dom 对象操纵 XML 节点!        // 利用 DOM 对象获得需要的文档内容!---> 根元素内容!    GDataXMLElement *rootElement = dom.rootElement;        // NSLog(@"%@",rootElement);        // 每一个元素都有属性内容和元素内容:(1.自己的元素内容, 2.子元素)        // NSLog(@"元素内容:%@ 元素属性内容:%@",rootElement.children,rootElement.attributes);        // 遍历根元素的子元素,取出对应的子元素 vedio 元素    [rootElement.children enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {                GDataXMLElement *vedioElement = obj;                // NSLog(@"%@",vedioElement.attributes);                // 根据 XML 文档特点,选择取出属性内容(属性值)还是元素内容(子元素)!                // 遍历 vedio 元素的属性数组,取出每一个属性的值.        [vedioElement.attributes enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {                        //            GDataXMLNode *node = obj;                        // node.name :属性 key node.stringValue :属性 value            NSLog(@"%@ %@",node.name,node.stringValue);                    }];    }];}


解析不带属性的 嵌套XML

// DOM解析- (void)domTestWithData:(NSData *)data{    // 1. 获得 dom 对象    GDataXMLDocument *dom = [[GDataXMLDocument alloc] initWithData:data options:0 error:NULL];        // 2. 获得根元素的内容    GDataXMLElement *rootElement = dom.rootElement;        // 遍历根元素的子元素,获得的是 vedio 元素.    [rootElement.children enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {                //        GDataXMLElement *vedioElement = obj;                CZVideo *video = [[CZVideo alloc] init];                // NSLog(@"%@",vedioElement);                // 遍历vedio元素的子元素,获得元素内容!                [vedioElement.children enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {                        GDataXMLElement *element = obj;                        NSLog(@"%@ %@",element.name ,element.stringValue);                        // 赋值            [video setValue:element.stringValue forKey:element.name];                    }];                [self.videos addObject:video];    }];    }


0 0