XML数据解析

来源:互联网 发布:网络龙虎赌博押注技巧 编辑:程序博客网 时间:2024/05/17 22:13

这是一篇关于XML解析的详细的Demo
里面是一些XML解析相关的方法
分两部分:
1.SAX系统解析 详细的model构建 以及解析过程 协议方法
2.Dom三方解析 两个重要的概念 ONOXMLDocument ONOXMLElement 获取节点数据
(HTTP—超文本传输协议

HTML—超文本标记语言

markdown—

WebService—数据格式XML

二叉树遍历

GFW——Great Fire Wall,长城防火墙,网络审查)

import “ViewController.h”

import “NewsDetailModel.h”

import < Ono.h >

@interface ViewController ()< NSXMLParserDelegate >

@property (nonatomic, strong) NSXMLParser * parser; // SAX
@property (nonatomic, strong) NewsDetailModel * detailModel; // 数据模型
@property (nonatomic, copy) NSString * nodeName; //记录当前解析的节点名称
@property (nonatomic, strong) ONOXMLDocument * onoDoc; // DOM解析方式
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UIWebView *webView;

@end

@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // [self SAXDemo];
    [self DOMDemo];
    }

  • (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }

pragma mark - DOM

  • (void)DOMDemo
    {
    __weak typeof(self) weakSelf = self;
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSData * xmlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@”http://www.oschina.net/action/api/news_detail?id=44393“]];
    NSLog(@”data = %@”, xmlData);
    NSError * error;
    // 创建Ono DOM解析文档对象
    weakSelf.onoDoc = [ONOXMLDocument XMLDocumentWithData:xmlData error:&error];
    // 获取DOM的根节点
    ONOXMLElement * rootElement = weakSelf.onoDoc.rootElement;
    NSLog(@”rootElement=%@”, rootElement.tag);
    // 找单个节点
    ONOXMLElement * idElement = [rootElement firstChildWithXPath:@”//news/id”];
    NSLog(@”idElement=%@”, idElement.tag);
    // 找到多个相同节点,需要找到节点的父节点,再通过父节点获取所有的子节点
    ONOXMLElement * relativiesElement = [rootElement firstChildWithXPath:@”//news/relativies”];
    NSArray * relativies = [relativiesElement childrenWithTag:@”relative”];
    NSLog(@”relativies count = %lu”, relativies.count);
    // 找到News节点
    ONOXMLElement * newsElement = [rootElement firstChildWithTag:@”news”];
    // 找到title节点
    ONOXMLElement * titleElement = [newsElement firstChildWithTag:@”title”];
    // 获取title节点前一个节点
    ONOXMLElement * preTitleElement = titleElement.previousSibling;
    // 获取title节点后一个节点
    ONOXMLElement * nextTitleElement = titleElement.nextSibling;
    // 创建模型,并找到相应的节点数据
    weakSelf.detailModel = [[NewsDetailModel alloc] init];
    weakSelf.detailModel.ID = idElement.stringValue;
    weakSelf.detailModel.title = titleElement.stringValue;
    // 找到body节点
    ONOXMLElement * bodyElement = [newsElement firstChildWithTag:@”body”];
    weakSelf.detailModel.body = bodyElement.stringValue;

    NSLog(@"model id = %@, title = %@, body = %@", weakSelf.detailModel.ID, weakSelf.detailModel.title, weakSelf.detailModel.body);// 回到主队列加载数据到UI上dispatch_async(dispatch_get_main_queue(), ^{    weakSelf.titleLabel.text = weakSelf.detailModel.title;    // UIWebView第一种加载网页,加载已有html代码    [weakSelf.webView loadHTMLString:weakSelf.detailModel.body baseURL:nil];});

    });
    }

pragma mark - SAX

// SAX XML解析方式
- (void)SAXDemo
{
__weak typeof(self) weakSelf = self;

NSURLSession * session = [NSURLSession sharedSession];NSURLSessionDataTask * dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"http://www.oschina.net/action/api/news_detail?id=44393"] completionHandler:^(NSData * data, NSURLResponse * response, NSError * error) {    NSLog(@"%@", data);    NSString * xmlStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];    NSLog(@"%@", xmlStr);    // 创建NSXMLParser对象    weakSelf.parser = [[NSXMLParser alloc] initWithData:data];    // 设置委托    weakSelf.parser.delegate = weakSelf;    // 开始解析    [weakSelf.parser parse];    // 中断/结束解析    //[weakSelf.parser abortParsing];}];[dataTask resume];

}

pragma mark - NSXMLParserDelegate

// 开始解析XML文档
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
// 在该协议方法实现中创建数据模型
self.detailModel = [[NewsDetailModel alloc] init];
NSLog(@”XML文档解析开始”);
}

  • (void)parserDidEndDocument:(NSXMLParser *)parser
    {
    NSLog(@”XML文档解析结束”);
    NSLog(@”NewsDetailModel:%@ %@ %@”, self.detailModel.ID, self.detailModel.title, self.detailModel.body);
    }

/**
* 解析节点数据相关方法
*/
/**
* 开始解析XML节点元素
*
* @param parser NSXMLParser解析类
* @param elementName 节点名称
* @param namespaceURI 命名空间URI,URL是URI的子集
* @param qName 命名空间中描述名称
* @param attributeDict 属性字典,属性的名称和值
*/
- (void)parser:(NSXMLParser )parser didStartElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName attributes:(NSDictionary *)attributeDict
{
NSLog(@”elementName = %@, attributeDict=%@”, elementName, attributeDict);
// 记录当前正在解析的节点
self.nodeName = elementName;
}

  • (void)parser:(NSXMLParser )parser didEndElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName
    {
    NSLog(@”XML节点:%@解析结束”, elementName);
    }

/**
* 解析XML节点中的文本信息
*/
// 解析节点中CDATA的数据
- (void)parser:(NSXMLParser )parser foundCDATA:(NSData )CDATABlock
{
NSString * cdataStr = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
NSLog(@”CDATA: %@”, cdataStr);
// 为数据模型赋值
if ([self.nodeName isEqualToString:@”title”]) {
self.detailModel.title = cdataStr;
}
}

// 解析节点中普通字符数据
- (void)parser:(NSXMLParser )parser foundCharacters:(NSString )string
{
NSLog(@”foundCharacters:%@”, string);
if ([self.nodeName isEqualToString:@”id”]) {
self.detailModel.ID = string;
}
}

@end

0 0
原创粉丝点击