Swift-使用NSXMLParser解析XML文件

Update 2015/12/01: Updated for Xcode 7.1.1 (7B1005) and Swift 2.1.

Swift-使用NSXMLParser解析XML文件

解析XML文件需要实现NSXMLParserDelegate协议,

实现以下几个函数:

//读取current_news_list文件,文件类型为xml
let xmlfile = NSBundle.mainBundle().pathForResource("current_news_list", ofType: "xml");
let xmlParse = NSXMLParser(contentsOfURL: NSURL(fileURLWithPath: xmlfile!))
xmlParse?.delegate = self
xmlParse?.parse()
//解析XML文档开始前
func parserDidStartDocument(parser: NSXMLParser) {}
  
//解析XML文档结束后
func parserDidEndDocument(parser: NSXMLParser) {}

//开始解析每个XML每个元素之前,即解析开始标签元素,如开始标签<news>
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {}

//解析每个XML元素之后,即解析结束标签元素,如闭合标签</news>
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {}

//解析XML的内容
func parser(parser: NSXMLParser, foundCharacters string: String) {}

具体代码实现:

访问:http://www.oschina.net/action/api/news_list

将页面保存为 current_news_list.xml

打开文件,其主要结构如下:

<newslist>
    <news>
        <id>68481</id>
        <title><![CDATA[PhalApi-v1.3.1 (感恩版)发布,PHP 轻量级开源接口框架]]></title>
        <body><![CDATA[PhalApi-v1.3.1 (感恩版)发布,PHP轻量级开源接口框架 [前言] 感恩节来临...]]></body>
        <commentCount>0</commentCount>
        <author><![CDATA[喵了_个咪]]></author>
        <authorid>2394822</authorid>
        <pubDate>2015-11-28 20:07:15</pubDate>
        <url></url>
        <newstype>
            <type>0</type>
            <authoruid2>2394822</authoruid2>
            <eventurl></eventurl>
        </newstype>
    </news>
</newslist>

ViewController文件代码:

//
//  ViewController.swift
//
import UIKit

class ViewController: UIViewController, NSXMLParserDelegate {

    var currentParsedElement:String? //当前解析的元素名
    var currentParsedElementValue:String! //当前解析的元素中的值
    
    var newsList:Array<NewsData> = [] //新闻列表,是类型为NewsData的数组
    var currentNews:NewsData! //当前的每条新闻,是类型为NewsData的对象
    
    var weAreInsideAnItem = false

    var current_news_id:String!      //当前新闻的id
    var current_news_author:String!  //当前新闻的作者
    var current_news_title:String!   //当前新闻的标题
    var current_news_pubDate:String! //当前新闻的发布时间
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        self.view.backgroundColor = UIColor.brownColor()
        
        let xmlfile = NSBundle.mainBundle().pathForResource("current_news_list", ofType: "xml");
        let xmlParse = NSXMLParser(contentsOfURL: NSURL(fileURLWithPath: xmlfile!))
        
        xmlParse?.delegate = self
        xmlParse?.parse()
    }
    
    //解析XML文档开始前
    func parserDidStartDocument(parser: NSXMLParser) {
        print("Start: parserDidStartDocument")
    }
    
    //解析XML文档结束后,打印获取的新闻列表数据
    func parserDidEndDocument(parser: NSXMLParser) {
        print("End: parserDidEndDocument")
        //print(newsList)
        //print(newsList[0].pubDate)
        for news in newsList{
            print("\(news.id!): \(news.title!) \(news.pubDate!)")
        }
    }
    
    //开始解析每个XML每个元素之前,即解析开始标签元素,如开始标签<news>
    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {

        currentParsedElement = elementName

        //print("start: \(elementName)")
        if currentParsedElement == "news" {
            weAreInsideAnItem = true
        }
        
    }
    
    //解析每个XML元素之后,即解析结束标签元素,如闭合标签</news>
    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        
        //print("  end:\(elementName)")
        if weAreInsideAnItem == true {
            
            if currentParsedElement == "id" {
                self.current_news_id = self.currentParsedElementValue
            }
            else if currentParsedElement == "title" {
                self.current_news_title = self.currentParsedElementValue
            }
            else if currentParsedElement == "author" {
                self.current_news_author = self.currentParsedElementValue
            }
            else if currentParsedElement == "pubDate" {
                self.current_news_pubDate = self.currentParsedElementValue
            }
        }
        
        if weAreInsideAnItem {
 
            //print("  currentNoteValue:\(currentParsedElementValue)" )
            //如果是闭合标签news,说明本条新闻解析完毕,将本条新闻加入到新闻列表中
            if elementName == "news" {
                //初始化新闻结构类型
                currentNews = NewsData()
                currentNews.id      = self.current_news_id as String!
                currentNews.title   = self.current_news_title as String!
                currentNews.author  = self.current_news_author as String!
                currentNews.pubDate = self.current_news_pubDate as String!

                //将 当前新闻内容 添加到 新闻列表数组 中
                newsList.append(currentNews)

                weAreInsideAnItem = false
            }
            
        }
        
    }
    
    //解析XML的内容
    func parser(parser: NSXMLParser, foundCharacters string: String) {
        //替换字符串:去掉空格和换行
        let str = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
        self.currentParsedElementValue = str
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}


NewsData文件代码:

import Foundation

//定义新闻的结构对象
class NewsData {
    
    var id:String?
    var title:String?
    var author:String?
    var pubDate:String?

}

获取的新闻列表数据:

68481: PhalApi-v1.3.1 (感恩版)发布,PHP 轻量级开源接口框架 2015-11-28 20:07:15 68480: Kreogist Mu 0.9.2 发布,跨平台音乐管理中心 2015-11-28 17:12:30 68479: anylog 1.0.5 版本发布,Java 动态日志注入工具 2015-11-28 10:00:19 68478: OSChina 周六乱弹 —— 你敢把电脑借给父母用吗? 2015-11-28 08:40:55 68477: JTune : LinkedIn 的 Java CMS 高精度优化 2015-11-28 08:39:04 68476: Git@OSC 推荐|移动端即时通讯框架 MobileIMSDK 2015-11-28 08:38:10 68475: 每日一博|Postgres-X2 部署步骤 2015-11-28 08:37:05 68474: 众包悬赏|Flynn 官方文档翻译 2015-11-28 08:35:15 68473: 丹麦第二大城市 Aarhus 投入开源软件的怀抱 2015-11-28 08:30:56 68472: NativeScript 1.5.0 发布,跨平台移动开发 2015-11-28 08:27:41 68471: TigerVNC 1.6.0 Beta 发布,优化 Java viewer 2015-11-28 08:24:48 68470: 一个 Hadoop 老兵的自白 2015-11-28 08:24:19 68469: Rocket 0.12.0 发布,CoreOS 容器引擎 2015-11-28 08:22:36 68468: Windows 10 现使用率已升至 12.4% 2015-11-28 08:21:33 68467: PHP 5.6.16 发布,Bug 修复版本 2015-11-28 08:19:19 68466: Spring Tool Suite 3.7.2 发布 2015-11-28 08:17:28 68465: Kwort Linux 4.3 发布,Linux 发行版 2015-11-28 08:14:26 68464: Apache Jackrabbit Oak 1.3.11 发布 2015-11-28 08:11:21 68463: GNOME 3.19.2 发布 2015-11-28 08:08:04 68462: Erlang/OTP 18.1.5 发布下载 2015-11-28 08:04:46

参考链接:

http://blog.csdn.net/like7xiaoben/article/details/7699965

转载于:https://my.oschina.net/wangyongtao/blog/537076

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值