下载地址  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:];
if (htmlContent.count<=) {
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==) {
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: 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<=) {
NSLog(@"没有匹配到数据");
return Elements;
} NSMutableArray *result=[NSMutableArray array];
//遍历匹配到的每个元素
for (int i=; i<Elements.count; i++) {
GDataXMLElement *element=Elements[i];
if (attributeArrarys.count>) {//如果节点有元素
NSMutableDictionary *dic=[NSMutableDictionary dictionaryWithCapacity:];
for (int i=; 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="">
<name>Ryan</name>
<age></age>
</User>
<User id="">
<name>Tang</name>
<age></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:];
keyString = [[NSMutableString alloc] initWithCapacity:];
xmlDataSource=[[NSMutableDictionary alloc] initWithCapacity:];
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=; 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=; i<; i++) {
if ([array containsObject:elementName]) {
elementName = [NSString stringWithFormat:@"%@%d", temp, i+];
}
else {
return elementName;
}
}
return nil;
}
- (id)getStringByKey:(NSString*)key {
NSArray *array = [key componentsSeparatedByString:@"/"];
NSDictionary *dic = [NSDictionary dictionary];
for (int i=; i<[array count]-; i++) {
dic = [dic objectForKey:[array objectAtIndex:i]];
}
NSString *temp = [dic objectForKey:[array objectAtIndex:[array count]-]];
if (!temp) {
temp = @"";
}
return temp;
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if ([dicNameArray count]>) {
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=; i<[dicNameArray count]-; i++) {
dic=[dic objectForKey:(NSString*)[dicNameArray objectAtIndex:i]];
}
return dic;
}
-(void) removeLastDic {
if ([dicNameArray count]>) {
[dicNameArray removeLastObject];
}
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if (endStringElement) {
if (![keyString isEqualToString:@"\n"]) {
if ([keyString hasPrefix:@"\n"]) {
[keyString setString:[keyString substringFromIndex:]];
}
NSMutableDictionary *dic = [self getLastDic];
[dic setObject:[NSString stringWithString:keyString] forKey:[dicNameArray objectAtIndex:[dicNameArray count]-]];
}
} [keyString setString:@""];
endStringElement = FALSE;
[self removeLastDic]; }
- (void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@" \nxml解析返回-->> %@",xmlDataSource);
if (aTarget && [aTarget respondsToSelector:@selector(NetWorkBackConnectID:BackDic:WithNetState:)]) {
[aTarget NetWorkBackConnectID:aConnectId BackDic:xmlDataSource WithNetState:];
}
} -(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:@"" 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:@"" ofType:@"xml"];
NSData *data=[[[NSData alloc] initWithContentsOfFile:path] autorelease];
UseXmlParser *xmlParse=[[UseXmlParser alloc] initWithParserData:data target:self connectId:];
[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:@"" 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:@"" ofType:@"xml"];
NSData *data=[[NSData alloc] initWithContentsOfFile:path]; NSArray *result= [JSDataXml ParseXmlWithPath:data XPath:@"//name" attributes:nil];
NSLog(@"__%@-->%zi",result,result.count);
}
@end

ios中xml和html解析(封装)的更多相关文章

  1. 2016 - 1- 23 iOS中xml解析 (!!!!!!!有坑要解决!!!!!!)

    一: iOS中xml解析的几种方式简介 1.官方原生 NSXMLParser :SAX方式解析,使用起来比较简单 2.第三方框架 libxml2 :纯C 同时支持DOM与SAX GDataXML: D ...

  2. IOS中KVO模式的解析与应用

    IOS中KVO模式的解析与应用 最近老翁在项目中多处用到了KVO,深感这种模式的好处.现总结如下: 一.概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修 ...

  3. iOS中XML的相关知识

    1.什么是XML “当 XML(扩展标记语言)于 1998 年 2 月被引入软件工业界时,它给整个行业带来了一场风暴.有史以来第一次,这个世界拥有了一种用来结构化文档和数据的通用且适应性强的格式,它不 ...

  4. iOS开发——XML/JSON数据解析

    NSJSONSerialization 接下来就正式开始.苹果官方给出的解析方式是性能最优越的,虽然用起来稍显复杂. 首先我们在上面已经有了我希望得到的信息的网站的API给我们的URL,在OC中,我要 ...

  5. 【原】IOS中KVO模式的解析与应用

    最近老翁在项目中多处用到了KVO,深感这种模式的好处.现总结如下: 一.概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单 ...

  6. python3.x中xml.etree.ElementTree解析xml举例

    1.新建xml import xml.etree.ElementTree as ETa=ET.Element('elem')c=ET.SubElement(a,'child1')c.text=&quo ...

  7. iOS边练边学--iOS中的json数据解析

    JSON数据(NSData) -> OC对照表 {} -> NSDictionary @{} [] -> NSArray @[] "jack" -> NSS ...

  8. iOS中UITextField 使用全面解析

    //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...

  9. iOS中UITextField 使用全面解析 分类: ios技术 2015-04-10 14:37 153人阅读 评论(0) 收藏

    //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...

随机推荐

  1. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

  2. 学界 | Yann LeCun新作,中日韩文本分类到底要用哪种编码?

    https://www.wxwenku.com/d/102093756 AI科技评论按:前几天,Yann LeCun与其学生 张翔在arXiv上发表了一篇新作「Which Encoding is th ...

  3. AI-终极算法-遗传算法

  4. [Spring boot] Read values from external properties file

    Let's say we have a extral app.proporites file which contains some extra configuration: // resources ...

  5. OpenGL ES 3.0顶点着色器(一)

    OpenGL ES 3.0流程图 1.Vertex Shader(顶点着色器) 顶点着色实现了一种通用的可编程方法操作顶点. 顶点着色器的输入包括以下几个: • Shader program.程序的顶 ...

  6. 浅谈压缩感知(九):正交匹配追踪算法OMP

    主要内容: OMP算法介绍 OMP的MATLAB实现 OMP中的数学知识 一.OMP算法介绍 来源:http://blog.csdn.net/scucj/article/details/7467955 ...

  7. 解决IE6兼容性问题的十一大技巧

    10要点解决IE6兼容性问题 1.使用声明 你必须经常在html网页头部放置一个声明,推荐使用严格的标准.例如 <!DOCTYPEHTMLPUBLIC“-//W3C//DTDHTML4.01// ...

  8. IPC's epoch 6 is less than the last promised epoch 7

    一.错误起因 Active NameNode日志出现异常IPC‘s epoch [X] is less than the last promised epoch [X+1],出现短期的双Active ...

  9. phpstudy部署thinkPHP

    利用phpstudy配置虚拟主机 Listen 8080 <VirtualHost _default_:80> DocumentRoot "D:\phpStudy\WWW&quo ...

  10. Linux文件压缩、打包、备份

    1:Linux常见的压缩文件 2:gzip压缩指令 3:bzip2压缩指令(比gzip更高压缩比) 同理,可以用bzcat\bzmore\bzless读取被压缩后文件内容. 4:xz压缩指令(比bzi ...