Swift - 解析XML格式數(shù)據(jù)(分別使用GDataXML和DDXML)

XML解析方式的選擇建議
  • 大文件用:NSXMLParser
  • 小文件用:GDataXML

假設(shè)需要被解析的XML數(shù)據(jù)文件video.xml如下:

<videos>
<video id="1" name="小黃人 第01部" length="10" image="resources/images/minion_01.png" url="resources/videos/minion_01.mp4"/>
<video id="2" name="小黃人 第02部" length="12" image="resources/images/minion_02.png" url="resources/videos/minion_02.mp4"/>
<video id="3" name="小黃人 第03部" length="14" image="resources/images/minion_03.png" url="resources/videos/minion_03.mp4"/>
<video id="4" name="小黃人 第04部" length="16" image="resources/images/minion_04.png" url="resources/videos/minion_04.mp4"/>
<video id="5" name="小黃人 第05部" length="18" image="resources/images/minion_05.png" url="resources/videos/minion_05.mp4"/>
<video id="6" name="小黃人 第06部" length="20" image="resources/images/minion_06.png" url="resources/videos/minion_06.mp4"/>
<video id="7" name="小黃人 第07部" length="22" image="resources/images/minion_07.png" url="resources/videos/minion_07.mp4"/>
<video id="8" name="小黃人 第08部" length="24" image="resources/images/minion_08.png" url="resources/videos/minion_08.mp4"/>
<video id="9" name="小黃人 第09部" length="26" image="resources/images/minion_09.png" url="resources/videos/minion_09.mp4"/>
<video id="10" name="小黃人 第10部" length="28" image="resources/images/minion_10.png" url="resources/videos/minion_10.mp4"/>
<video id="11" name="小黃人 第11部" length="30" image="resources/images/minion_11.png" url="resources/videos/minion_11.mp4"/>
<video id="12" name="小黃人 第12部" length="32" image="resources/images/minion_12.png" url="resources/videos/minion_12.mp4"/>
<video id="13" name="小黃人 第13部" length="34" image="resources/images/minion_13.png" url="resources/videos/minion_13.mp4"/>
<video id="14" name="小黃人 第14部" length="36" image="resources/images/minion_14.png" url="resources/videos/minion_14.mp4"/>
<video id="15" name="小黃人 第15部" length="38" image="resources/images/minion_15.png" url="resources/videos/minion_15.mp4"/>
<video id="16" name="小黃人 第16部" length="40" image="resources/images/minion_16.png" url="resources/videos/minion_16.mp4"/>
</videos>

一,使用GDataXML(這個(gè)是google出品的)

  1. 在Build Phases -> Link Binary With Libraries中,點(diǎn)擊“+”添加“l(fā)ibxml2.2.tbd”
  2. 在Build Setting -> Header Search Paths里添加
    ${SDK_DIR}/usr/include/libxml2


  1. 在Build Setting -> Other Linker Flags 里添加 -lxml2


  1. 在Build Phases里找到GDataXMLNode.m文件設(shè)置為非ARC(-fno-objc-arc)


  1. 添加bridge.h頭文件并設(shè)置到編譯參數(shù)里
#import "GDataXMLNode.h"
  1. 導(dǎo)入GDataXML庫文件(GDataXMLNode.h和GDataXMLNode.m),代碼結(jié)構(gòu)如下:
  1. 開始解析(ViewController.swift)
import UIKit
import MediaPlayer

class VideosTableViewController: UITableViewController {
    lazy var videos: NSMutableArray = {
        return NSMutableArray()
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        /*
        加載服務(wù)器最新的視頻信息
        */
        let urlStr = String(format: "http://localhost:8080/MJServer/video")
        let url = NSURL(string: urlStr)
        // 創(chuàng)建一個(gè)請(qǐng)求
        let request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "POST"
        // 設(shè)置請(qǐng)求體(參數(shù))
        let param = String(format: "type=%@", "XML")
        // 設(shè)置字符串編碼
        request.HTTPBody = param.dataUsingEncoding(NSUTF8StringEncoding)

        // 發(fā)送異步請(qǐng)求
        let queue = NSOperationQueue.mainQueue()
        NSURLConnection.sendAsynchronousRequest(request, queue: queue) { (request, data, error) -> Void in
            if error != nil || data == nil {
                MBProgressHUD.showError("網(wǎng)絡(luò)繁忙")
                return
            }
            
            // 加載整個(gè)XML數(shù)據(jù)
            let doc = try! GDataXMLDocument(data: data!, options: 0)
            // 獲取文檔的根節(jié)點(diǎn)
            let root = doc.rootElement()
            // 獲得根節(jié)點(diǎn)里面所有的video元素
            let elements = root.elementsForName("video") as! [GDataXMLElement]
            // 遍歷所有的video元素
            for videoElement in elements {
                let video: Video = Video()
                // 取出元素的屬性
                video.id = videoElement.attributeForName("id").stringValue()
                video.name = videoElement.attributeForName("name").stringValue()
                video.image = videoElement.attributeForName("image").stringValue()
                video.url = videoElement.attributeForName("url").stringValue()
                video.length = videoElement.attributeForName("length").stringValue()
                
                // 添加到數(shù)組中
                self.videos.addObject(video)
            }
            
            self.tableView.reloadData()
        }
    }
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.videos.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let id = "video"
        var cell = tableView.dequeueReusableCellWithIdentifier(id)
        if cell == nil {
            cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: id)
        }
        let video = self.videos[indexPath.row] as! Video
        
        cell?.textLabel?.text = video.name
        cell?.detailTextLabel?.text = String(format: "時(shí)長: %d 分鐘", video.length!)
        
       
        let urlStr = String(format: "http://localhost:8080/MJServer/%@", video.image!)
        let url = NSURL(string: urlStr)
        // 這里使用了SDWebImage
        cell?.imageView?.sd_setImageWithURL(url, placeholderImage: UIImage(named: "placehoder"))
        
        return cell!
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // 取出對(duì)應(yīng)的模型
        let video = self.videos[indexPath.row] as! Video
        
        // 創(chuàng)建系統(tǒng)提供的視頻播放控制器
        let videoUrl = String(format: "http://localhost:8080/MJServer/%@", video.url!)
        let url = NSURL(string: videoUrl)
        let playerVC = MPMoviePlayerViewController(contentURL: url)
        
        // 顯示播放器
        self.presentViewController(playerVC, animated: true, completion: nil)
        
    }
}

二,使用NSXMLParser

import UIKit
import MediaPlayer

class VideosTableViewController: UITableViewController, NSXMLParserDelegate {
    lazy var videos: NSMutableArray = {
        return NSMutableArray()
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        /*
        加載服務(wù)器最新的視頻信息
        */
        let urlStr = String(format: "http://localhost:8080/MJServer/video")
        let url = NSURL(string: urlStr)
        // 創(chuàng)建一個(gè)請(qǐng)求
        let request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "POST"
        // 設(shè)置請(qǐng)求體(參數(shù))
        let param = String(format: "type=%@", "XML")
        // 設(shè)置字符串編碼
        request.HTTPBody = param.dataUsingEncoding(NSUTF8StringEncoding)

        // 發(fā)送異步請(qǐng)求
        let queue = NSOperationQueue.mainQueue()
        NSURLConnection.sendAsynchronousRequest(request, queue: queue) { (request, data, error) -> Void in
            if error != nil || data == nil {
                MBProgressHUD.showError("網(wǎng)絡(luò)繁忙")
                return
            }
            
            // 1.創(chuàng)建XML解析器 -- SAX -- 逐個(gè)元素往下解析
            let parser = NSXMLParser(data: data!)
            // 2.設(shè)置代理
            parser.delegate = self
            // 3.開始解析(同步執(zhí)行)
            parser.parse()
            
            self.tableView.reloadData()
        }
    }
    /*****************************實(shí)現(xiàn)代理方法start***************************/
    /**
     解析到文檔的開頭時(shí)調(diào)用
     */
    func parserDidStartDocument(parser: NSXMLParser) {
        
    }
    /**
     解析到一個(gè)元素的開始就會(huì)調(diào)用
     
     - parameter elementName:   元素名稱
     - parameter attributeDict: 屬性字典
     */
    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
        if elementName == "videos" {
            // 如果解析的是跟節(jié)點(diǎn)直接返回
            return
        }
        // 解析到元素的時(shí)候,創(chuàng)建模型賦值
        let video = Video(dict: attributeDict)
        self.videos.addObject(video)
        
    }
    /**
     解析到一個(gè)元素的結(jié)束就會(huì)調(diào)用
     
     - parameter elementName:   元素名稱
     */
    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        
    }
    
    /**
     解析到文檔的結(jié)尾時(shí)調(diào)用(解析結(jié)束)
     */
    func parserDidEndDocument(parser: NSXMLParser) {
        
    }
    /*****************************實(shí)現(xiàn)代理方法end***************************/

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.videos.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let id = "video"
        var cell = tableView.dequeueReusableCellWithIdentifier(id)
        if cell == nil {
            cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: id)
        }
        let video = self.videos[indexPath.row] as! Video
        
        cell?.textLabel?.text = video.name
        cell?.detailTextLabel?.text = String(format: "時(shí)長: %d 分鐘", video.length!)
        
        let urlStr = String(format: "http://localhost:8080/MJServer/%@", video.image!)
        let url = NSURL(string: urlStr)
        cell?.imageView?.sd_setImageWithURL(url, placeholderImage: UIImage(named: "placehoder"))
        
        return cell!
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // 取出對(duì)應(yīng)的模型
        let video = self.videos[indexPath.row] as! Video
        
        // 創(chuàng)建系統(tǒng)提供的視頻播放控制器
        let videoUrl = String(format: "http://localhost:8080/MJServer/%@", video.url!)
        let url = NSURL(string: videoUrl)
        let playerVC = MPMoviePlayerViewController(contentURL: url)
        
        // 顯示播放器
        self.presentViewController(playerVC, animated: true, completion: nil)
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容