zoukankan      html  css  js  c++  java
  • ios中xml和html解析(封装)

    下载地址  http://pan.baidu.com/share/link?shareid=2902188921&uk=923776187

    GDataXML和TFHpple配置是一样的(配置方式参考 http://blog.csdn.net/ryantang03/article/details/7868246)

    主要封装代码

    html封装

    #import <Foundation/Foundation.h>
    #import "TFHpple.h"
    
    @interface JSHpple : NSObject
    +(id)ShareHpple;
    -(NSArray *)HtmlWithData:(NSData *)data XPath:(NSString *)path;
    @end
    
    #import "JSHpple.h"
    
    @implementation JSHpple
    
    +(id)ShareHpple{
        static dispatch_once_t onceToken;
        static JSHpple *hpple=nil;
        dispatch_once(&onceToken, ^{
            hpple=[[JSHpple alloc] init];
        });
        return hpple;
    }
    
    
    -(NSArray *)HtmlWithData:(NSData *)data XPath:(NSString *)path{
        TFHpple *happen=[[TFHpple alloc] initWithHTMLData:data];
        NSArray *htmlContent=[happen searchWithXPathQuery:path];
        NSMutableArray *result=[NSMutableArray arrayWithCapacity:0];
        if (htmlContent.count<=0) {
            NSLog(@"没有解析到对应的数据");
            return nil;
        }
        for (TFHppleElement *ele in htmlContent) {
            NSString *content=[self SearchElement:ele];
            if (!content) {
                content=@"Null";
            }
            [result addObject:content];
        }
        
        return result;
        
    }
    
    -(NSString *)SearchElement:(TFHppleElement *)element{
          NSArray *childs=[element children];
        if (childs.count==1) {
            if ([[childs lastObject] isTextNode]) {//没有子节点
                return [element text];
            }
            else{//有子节点
                TFHppleElement *childElement=[childs lastObject];
                NSString *content=[self SearchElement:childElement];
                if (content) {
                    return content;
                }
            }
        }
        return nil;
    }
    
    
    @end

    xml  -->GDataxml的用法 (通用)

    #import <Foundation/Foundation.h>
    #import "GDataXMLNode.h"
    
    @interface JSDataXml : NSObject
    
    +(NSArray *)ParseXmlWithPath:(NSData *)data XPath:(NSString *)path attributes:(NSArray *)attributeArrarys;
    @end
    
    
    #import "JSDataXml.h"
    
    @implementation JSDataXml
    
    
    
    +(NSArray *)ParseXmlWithPath:(NSData *)data XPath:(NSString *)path attributes:(NSArray *)attributeArrarys{
        
        NSError *error=nil;
        //开始解析
        GDataXMLDocument *doc=[[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
        if (error) {
            NSLog(@"xml解析失败-->%@",[error localizedDescription]);
            return nil;
        }
        //得到根元素
        GDataXMLElement *rootElement=[doc rootElement];
        //利用xpath找元素
        
        NSArray *Elements=[rootElement nodesForXPath:path error:&error];
        if (error) {
            NSLog(@"xpath有误-->%@",[error localizedDescription]);
            return nil;
        }
        if (Elements.count<=0) {
            NSLog(@"没有匹配到数据");
            return Elements;
        }
        
    
        NSMutableArray *result=[NSMutableArray array];
        //遍历匹配到的每个元素
        for (int i=0; i<Elements.count; i++) {
            GDataXMLElement *element=Elements[i];
            if (attributeArrarys.count>0) {//如果节点有元素
                NSMutableDictionary *dic=[NSMutableDictionary dictionaryWithCapacity:0];
                for (int i=0; i<attributeArrarys.count; i++) {
                    NSString *key=attributeArrarys[i];
                    NSString *value=[[element attributeForName:key] stringValue];
                    if (!value) {
                        value=@"NULL";
                    }
                    [dic setObject:value forKey:key];
                   
                }
                 [result addObject:dic];
            }
            else{//如果节点没有元素,默认就返回属性值
                NSString *str= [element  stringValue];
                [result addObject:str];
            }
    
        }
        
        return result;
    }
    
    @end

    xml 第二种封装(一个子节点没有属性)推荐使用

    只适合这种xml数据格式

    <?xml version="1.0" encoding="utf-8"?>  
    <Users>  
        <User id="001">
            <name>Ryan</name>  
            <age>24</age>  
        </User>  
        <User id="002">  
            <name>Tang</name>  
            <age>23</age>  
        </User>  
    </Users>
    @protocol UseXmlParser <NSObject>
    
    @optional
    - (void)NetWorkBackConnectID:(int)connectID BackDic:(NSMutableDictionary*)aBackDic WithNetState:(int)netState;
    
    @end
    
    @interface UseXmlParser : NSObject<NSXMLParserDelegate>
    {
        id aTarget;
        int aConnectId;
        
        NSMutableData *parData;
        
        NSXMLParser *xmlParser;
        
        NSMutableArray *dicNameArray;
        BOOL endStringElement;
        NSMutableString *keyString;
        NSMutableDictionary *xmlDataSource;
    }
    -(id)initWithParserData:(NSData*)pData target:(id)toTarget connectId:(int)bConnectId;
    
    -(void)parser;
    
    @end
    
    
    #import "UseXmlParser.h"
    
    @implementation UseXmlParser
    
    
    -(id)initWithParserData:(NSData*)pData target:(id)toTarget connectId:(int)bConnectId{
        if (self = [super init]) {
            
            aTarget = toTarget;
            aConnectId = bConnectId;
            
            dicNameArray = [[NSMutableArray alloc] initWithCapacity:0];
            keyString = [[NSMutableString alloc] initWithCapacity:0];
            xmlDataSource=[[NSMutableDictionary alloc] initWithCapacity:0];
            endStringElement = FALSE;
            
            parData = [[NSMutableData alloc] initWithData:pData];
            
    
        }
        return self;
    }
    -(void)parser{
        xmlParser = [[NSXMLParser alloc] initWithData:parData];
        [xmlParser setDelegate:self];
        [xmlParser parse];//开始解析
        [xmlParser release];
    }
    
    -(NSMutableDictionary*) getDic {
        NSMutableDictionary *dic=xmlDataSource;
        for (int i=0; i<[dicNameArray count]; i++) {
            dic=[dic objectForKey:(NSString*)[dicNameArray objectAtIndex:i]];
        }
        return dic;
    }
    - (NSString*)getListElement:(NSString*)elementName From:(NSArray*)array {
        NSString *temp = elementName;
        for (int i=0; i<100000; i++) {
            if ([array containsObject:elementName]) {
                elementName = [NSString stringWithFormat:@"%@%d", temp, i+1];
            }
            else {
                return elementName;
            }
        }
        return nil;
    }
    - (id)getStringByKey:(NSString*)key {
        NSArray *array = [key componentsSeparatedByString:@"/"];
        NSDictionary *dic = [NSDictionary dictionary];
        for (int i=0; i<[array count]-1; i++) {
            dic = [dic objectForKey:[array objectAtIndex:i]];
        }
        NSString *temp = [dic objectForKey:[array objectAtIndex:[array count]-1]];
        if (!temp) {
            temp = @"";
        }
        return temp;
    }
    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
        if ([dicNameArray count]>0) {
            NSMutableDictionary *dic = [self getDic];
            elementName = [self getListElement:elementName From:[dic allKeys]];
            
            [dic setObject:[[NSMutableDictionary alloc] init] forKey:elementName];
            [dicNameArray addObject:elementName];
        }
        else {
            [xmlDataSource setObject:[[NSMutableDictionary alloc] init] forKey:elementName];
            [dicNameArray addObject:elementName];
        }
        
        endStringElement = TRUE;
        [keyString setString:@""];
    }
    
    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        [keyString appendString:string];
    }
    - (NSMutableDictionary*)getLastDic {
        NSMutableDictionary *dic=xmlDataSource;
        for (int i=0; i<[dicNameArray count]-1; i++) {
            dic=[dic objectForKey:(NSString*)[dicNameArray objectAtIndex:i]];
        }
        return dic;
    }
    -(void) removeLastDic {
        if ([dicNameArray count]>0) {
            [dicNameArray removeLastObject];
        }
    }
    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
        if (endStringElement) {
            if (![keyString isEqualToString:@"
    "]) {
                if ([keyString hasPrefix:@"
    "]) {
                    [keyString setString:[keyString substringFromIndex:1]];
                }
                NSMutableDictionary *dic = [self getLastDic];
                [dic setObject:[NSString stringWithString:keyString] forKey:[dicNameArray objectAtIndex:[dicNameArray count]-1]];
            }
        }
        
        [keyString setString:@""];
        endStringElement = FALSE;
        [self removeLastDic];
        
    }
    - (void)parserDidEndDocument:(NSXMLParser *)parser {
        NSLog(@" 
    xml解析返回-->> %@",xmlDataSource);
        if (aTarget && [aTarget respondsToSelector:@selector(NetWorkBackConnectID:BackDic:WithNetState:)]) {
            [aTarget NetWorkBackConnectID:aConnectId BackDic:xmlDataSource WithNetState:0];
        }
    }
    
    -(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
        NSLog(@"--error-->%@",parseError.localizedDescription);
    }
    -(void)dealloc{
        
        [dicNameArray release];
        [keyString release];
        [xmlDataSource release];
        [super dealloc];
    }
    @end

    三种使用方式

    #import "ViewController.h"
    #import "JSDataXml.h"
    #import "JSHpple.h"
    @interface ViewController (){
        //配置GDDataXML和TFHpple是相同的。
        //配置信息 http://blog.csdn.net/ryantang03/article/details/7868246
    }
    
    @end
    
    @implementation ViewController
    
    
    
    #pragma mark -解析html
    
    - (IBAction)Htmlclick:(id)sender {
        NSString *path=[[NSBundle mainBundle] pathForResource:@"1" ofType:@"html"];
        NSData *data=[[NSData alloc] initWithContentsOfFile:path];
       NSArray *result= [[JSHpple ShareHpple] HtmlWithData:data XPath:@"//td"];
        NSLog(@"--%@",result);
        
    }
    
    #pragma mark -解析一个节点一个属性格式的xml
    - (IBAction)ParseXmlOneclick:(id)sender {
        NSString *path=[[NSBundle mainBundle] pathForResource:@"2" ofType:@"xml"];
        NSData *data=[[[NSData alloc] initWithContentsOfFile:path] autorelease];
        UseXmlParser *xmlParse=[[UseXmlParser alloc] initWithParserData:data target:self connectId:100];
        [xmlParse parser];
    }
    
    - (void)NetWorkBackConnectID:(int)connectID BackDic:(NSMutableDictionary*)aBackDic WithNetState:(int)netState{
        NSLog(@"-connectId-->%zi-->%@",connectID, aBackDic);
    }
    
    
    #pragma mark -通用方式
    - (IBAction)ParseXmlMangeclick:(id)sender {
    //   #pragma mark -解析xml第一种格式
       [self ParseXmlMethod1];
    //    #pragma mark -解析xml第二种格式
        [self ParseXmlMethod2];
    }
    
    #pragma mark -解析xml第一种格式
    -(void)ParseXmlMethod1{
        NSString *path=[[NSBundle mainBundle] pathForResource:@"1" ofType:@"xml"];
        NSData *data=[[NSData alloc] initWithContentsOfFile:path];
        NSArray *attribute=@[@"wait_count",@"max_wait_time",@"branch_name",@"branch_id"];
        NSArray *result= [JSDataXml ParseXmlWithPath:data XPath:@"//item" attributes:attribute];
        NSLog(@"__%@-->%zi",result,result.count);
    }
    
    #pragma mark -解析xml第二种格式
    -(void)ParseXmlMethod2{
        NSString *path=[[NSBundle mainBundle] pathForResource:@"2" ofType:@"xml"];
        NSData *data=[[NSData alloc] initWithContentsOfFile:path];
    
        NSArray *result= [JSDataXml ParseXmlWithPath:data XPath:@"//name" attributes:nil];
        NSLog(@"__%@-->%zi",result,result.count);
    }
    @end
  • 相关阅读:
    Vue 实现前进刷新,后退不刷新的效果
    chrome浏览器的跨域设置——包括版本49前后两种设置
    Promise.all和Promise.race区别,和使用场景
    滚动条默认最底部
    使用react进行父子组件传值
    java 数组基础学习(一维二维数组)
    react项目 使用echarts
    Python的hasattr() getattr() setattr() 函数使用方法详解
    【线性判别】Fisher线性判别(转)
    【semantic segmentation】Pyramid Scene Parsing Network(转)
  • 原文地址:https://www.cnblogs.com/gcb999/p/3275643.html
Copyright © 2011-2022 走看看