XML 解析
来源:互联网 发布:金红米i7手机数据参数 编辑:程序博客网 时间:2024/06/06 00:55
1.XML
#pragma mark - 下载解析数据
//开源中国动弹界面接口
#define OCTweetURL @"http://www.oschina.net/action/api/tweet_list?uid=0&pageIndex=5&pageSize=20"
//网络加载XML
-(void)startDownloadData
{
NSString *urlString = OCTweetURL;
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:urlString parameters:nilsuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
//解析数据
//XML解析第三方库
GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:responseObject options:0 error:nil];
if(doc)
{
@"//tweet"找到 "tweet"的节点,所有还含有"tweet"的节点
NSArray *tweets = [doc nodesForXPath:@"//tweet" error:nil];
for (GDataXMLElement *element in tweets)
{
//数据模型
TweetModel *model = [[TweetModel alloc] init];
for (GDataXMLElement *subElement in element.children) {
[model setValue:subElement.stringValueforKey:subElement.name];
}
[_dataArray addObject:model];
}
[self.tableView reloadData];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error = %@",error);
}];
}
2 XML大致使用
//本地加载使用
-(void)manzuoXmlPsraser
{
//<1>加载xml文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"cate.xml"ofType:nil];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
//<2>解析xml
// GDataXMLDocument 表示整个xml文档
//参数1: xml数据, 以后放上下载数据
//参数2: 默认0
//参数3: 一般设置为nil
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:dataoptions:0 error:nil];
//获取所有的promotion结点
//XPath: //promotion
NSArray *array = [doc nodesForXPath:@"//promotion" error:nil];
for (GDataXMLElement *e in array) {
NSLog(@"name = %@",e.name);
NSString *id = [[[e elementsForName:@"id"] firstObject]stringValue];
NSString *name = [[[e elementsForName:@"name"] firstObject]stringValue];
NSString *price = [[[e elementsForName:@"price"] firstObject]stringValue];
PromotionModel *model = [[PromotionModel alloc] init];
model.id = id;
model.name = name;
model.price = price;
// add array
}
}
-(void)xmlBasicUse
{
//xml解析
//<1>加载xml文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"xml.txt"ofType:nil];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
//<2>解析xml
// GDataXMLDocument 表示整个xml文档
//参数1: xml数据, 以后放上下载数据
//参数2: 默认0
//参数3: 一般设置为nil
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:dataoptions:0 error:nil];
//<3>从解析后的文档中获取数据
//核心: 使用XPath语法
//实例 CityName结点的XPath
// /root/SystemConfig/CityName
// 返回匹配xpath语法规则的结点数组
NSArray *array = [doc nodesForXPath:@"/root/systemConfig/CityName"error:nil];
GDataXMLElement *citName = [array firstObject];
NSLog(@"name=%@ value=%@",citName.name,citName.stringValue);
//<4>获取带有属性的结点
array = [doc nodesForXPath:@"/root/systemConfig/IntentionLevel/Item"error:nil];
for (GDataXMLElement *e in array) {
NSLog(@"name = %@",e.name);
//属性如何获取
// 结点的attributes包含的结点的所有属性
// 属性用GDataXMLElement
for(GDataXMLElement *a in e.attributes)
{
NSLog(@"attr name=%@ value=%@",a.name,a.stringValue);
}
}
//<5>快速获取某种类型的结点 (项目中常用)
//实例: 获取所有的名字为Item的结点, 而不管在哪儿?
//XPath: //Item
array = [doc nodesForXPath:@"//Item" error:nil];
for (GDataXMLElement *e in array) {
NSLog(@"-> %@",e.name);
}
//<6>遍历xml文档
//GDataXMLElement *root = doc.rootElement;
//获取一个结点子节点
//root.children
//子节点个数
//root.childCount
//获取某个名字的子节点
//root elementsForName:<#(NSString *)#>
}
GDataXML
来看GDataXML,它是一种DOM方式的解析类库。DOM实现的原理是把整个xml文档一次性读出,放在一个树型结构里。在需要的时候,查找特定节点,然后对节点进行读或写。
在使用之前呢,我们还是先从网上下载GDataXML包,里面两个文件GDataXMLNode.h和GDataXMLNode.m导入到项目中来,编译,发现报错了,这是因为GDataXML是依赖libmxl2的,我们要去项目的Target中做一些设置。
- 找到项目的Tarfet,进入Build Phases里面的Link Binary With Libraries,点击“加号”,搜索libxml,把出现的包添加进去,这里最新版的XCode7和iOS9中,是libxml.2.2.tbd。
- 再来到Build Settings,我们可以搜索一下,找到Header Search Paths,添加路径“/usr/include/libxml2”。
- 再找到Other Link Flags,添加“-libxml2“
- 还有就是如果你下载的GDataXML是不支持ARC的,那么你就要像上面那样去添加“-fno-objc-arc”,这个视你下载的GDataXML包版本而定。
再次编译,就顺利通过了。
接下来看看我们怎么用这个东西。贴代码之前我真的想说一句,比起苹果原生的类库,这些开源的第三方类库真的在用起来的时候不知道有多舒服,懒人必备啊。在实际的开发中可以为我们节省很多的时间与精力,但是还是要搞懂人家原生的东西,这样才叫学会了么。
//ViewController.m- (IBAction)GDataXML:(id)sender { NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"]; NSData *data = [[NSData alloc]initWithContentsOfFile:path]; //对象初始化 GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data error:nil]; //获取根节点 GDataXMLElement *rootElement = [doc rootElement]; //获取其他节点 NSArray *students = [rootElement elementsForName:@"student"]; //初始化可变数组,用来显示到textView self.GDatatext = [[NSMutableString alloc]initWithString:@""]; for (GDataXMLElement *student in students) { //获取节点属性 GDataXMLElement *pidElement = [[student elementsForName:@"pid"] objectAtIndex:0]; NSString *pid = [pidElement stringValue]; GDataXMLElement *nameElement = [[student elementsForName:@"name"] objectAtIndex:0]; NSString *name = [nameElement stringValue]; GDataXMLElement *sexElement = [[student elementsForName:@"sex"] objectAtIndex:0]; NSString *sex = [sexElement stringValue]; GDataXMLElement *ageElement = [[student elementsForName:@"age"] objectAtIndex:0]; NSString *age = [ageElement stringValue]; //调整一下姿势,添加到可变长字符串~~ NSString *t = [NSString stringWithFormat:@"学号:%@ 姓名:%@ 性别:%@ 年龄:%@\n", pid, name, sex, age]; [self.GDatatext appendString:t]; } self.textView.text = self.GDatatext;}
就一段,是不是看起来非常的舒服呢!
- XML解析
- xml解析
- XML解析
- 解析XML
- xml解析
- 解析xml
- 解析xml
- xml解析
- XML解析
- xml解析
- XML解析
- xml解析
- xml解析
- xml解析
- xml解析
- xml解析
- 解析xml
- XML解析
- 零编程经验的我是如何找到工作的
- Android面试复习
- 详细探究Spark的shuffle实现
- Bitmap index引发的死锁
- Hunter Tip #2 Nullie the Elephant
- XML 解析
- Router
- IP地址,子网掩码,默认网关,路由,形象生动阐述
- 51. N-Queens
- js操作函数,判断传递参数合法性和个数
- Timus Online Judge:1119. Metro
- Android Studio(DDMS)中的那些招
- C#连接MySQL数据库
- 2.2 SimpleAdapter的使用