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,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.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,attributes attributeDict: [String : String]) { currentParsedElement = elementName //print("start: \(elementName)") if currentParsedElement == "news" { weAreInsideAnItem = true } } //解析每个XML元素之后,即解析结束标签元素,如闭合标签</news> func parser(parser: NSXMLParser,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. } }
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
参考链接: