文档章节

Swift-使用NSXMLParser解析XML文件

王永濤
 王永濤
发布于 2015/11/29 15:17
字数 1176
阅读 490
收藏 1

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

© 著作权归作者所有

共有 人打赏支持
王永濤
粉丝 10
博文 58
码字总数 35962
作品 0
浦东
程序员
私信 提问
iOS XML 解析器--AEXML

AEXML 是简单,轻量级的 iOS XML 解析器,使用 Swift 编写。 AEXML 包括三个对象: AEXMLElement (base class),AEXMLDocument (inherited from previous) 和 AEXMLParser (simple wrapper ......

叶秀兰
2014/10/21
580
0
json 和xml 数据解析

使用NSURLConnection来请求数据 JSON数据的请求 现在大多情况下都使用三方框架来完成的 l在iOS中,JSON的常见解析方案有4种 p第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)...

codeShuai
2016/04/19
0
0
UI_16 XML、JSON数据结构解析

从事先规定好的格式中提取数据,即为解析。iOS开发常见的解析有:XML解析、JSON解析 一、XML解析 XML:Extensible Markup language(可扩展标记语⾔),主流数 据格式之⼀,可以⽤来存储和传...

黑伞将军
2015/09/05
189
0
XML_解析使用NSXMLPaser(SAX)和GDataXML(DOM)

XML有两种解析方法SAX和DOM。 SAX方法可以使用iOS SDK中的NSXMLParser,DOM方法可以使用GOOGLE提供的GDataXML(下载地址:http://code.google.com/p/gdata-objectivec-client/downloads/deta...

LouDev
2013/03/11
2K
0
iPhone中XML处理以及网络上的图片显示

xml处理: iPhone开发中,XML处理的方式与.net区别很大。个人感觉没有donot那么方便。苹果sdk中提供了NSXMLParser这个类库来解析xml。它需要一个url作为输入参数,通过NSXMLParser的委托方法...

晨曦之光
2012/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker部署springboot项目

安装docker 菜鸟教程 springboot项目 maven依赖 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001......

yimingkeji
今天
10
0
ios多个target

1.建立3个target,分别为heroone,heroone test,heroone dev;分别为正式环境,test环境,dev环境 2.注意取消掉autocreate以防止名字不对,分别以Duplicate的方式建立另外两个scheme 3.创建...

HeroHY
今天
5
0
php获取客户端IP

php获取客户端IP 首先先阅读关于IP真实性安全的文章:如何正確的取得使用者 IP? 「任何從客戶端取得的資料都是不可信任的!」 HTTP_CLIENT_IP头是有的,但未成标准,不一定服务器都实现。 ...

DrChenXX
昨天
0
0
. The valid characters are defined in RFC 7230 and RFC 问题

通过这里的回答,我们可以知道: Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom...

west_coast
昨天
1
0
刷leetcode第704题-二分查找

今天双十一买的算法书到货了,路上刷到有人说的这个题,借(chao)鉴(xi)一下别人的思路,这个是C++标准库里面的经典方法,思路精巧,优雅好品味 int search(int* nums, int numsSize, in...

锟斤拷烫烫烫
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部