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