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文件代码:

//
//  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.
    }
    
}

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://www.jb51.cc/article/p-empqvddu-bdk.html

Swift-使用NSXMLParser解析XML文件的更多相关文章

  1. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

  3. ios – 在Swift中将输入字段字符串转换为Int

    所以我非常擅长制作APP广告Swift,我试图在文本字段中做一些非常简单的输入,取值,然后将它们用作Int进行某些计算.但是’vardistance’有些东西不正确它是导致错误的最后一行代码.它说致命错误:无法解开Optional.None解决方法在你的例子中,距离是一个Int?否则称为可选的Int..toInt()返回Int?因为从String到Int的转换可能失败.请参阅以下示例:

  4. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

    Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

  5. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  6. xamarin – 崩溃在AccountStore.Create().保存(e.Account,“);

    在Xamarin.Forms示例TodoAwsAuth中https://developer.xamarin.com/guides/xamarin-forms/web-services/authentication/oauth/成功登录后,在aOnAuthenticationCompleted事件中,应用程序在尝试保存到Xamarin.Auth时崩溃错误说不能对钥匙串说期待着寻求帮助.解决方法看看你

  7. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  8. xcode – 错误“线程1:断点2.1”

    我正在研究RESTAPI管理器.这是一个错误,我无法解决它.我得到的错误在下面突出显示.当我打电话给这个班级获取资源时:我评论的线打印:Thread1:breakpoint2.1我需要修复错误的建议.任何建议都非常感谢解决方法您可能在不注意的情况下意外设置了断点.单击并拖动代表断路器外部断点的蓝色刻度线以将其擦除.

  9. ios – 更改导航栏标题swift中的字符间距

    类型的值有人可以帮我这个或建议一种不同的方式来改变swift中导航栏标题中的字符间距吗?解决方法您无法直接设置属性字符串.你可以通过替换titleView来做一个技巧

  10. ios – 如何从变量访问属性或方法?

    是否可以使用变量作为Swift中方法或属性的名称来访问方法或属性?在PHP中,您可以使用$object->{$variable}.例如编辑:这是我正在使用的实际代码:解决方法你可以做到,但不能使用“纯粹的”Swift.Swift的重点是防止这种危险的动态属性访问.你必须使用Cocoa的Key-ValueCoding功能:非常方便,它完全穿过你要穿过的字符串到属性名称的桥,但要注意:这里是龙.

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部