iOS開發之解析XML格式資料

乞力馬紮羅的雪CYF發表於2015-08-06

     XML格式的資料是一種資料的傳輸格式,由於它方便編寫,結構清晰,所以深受程式設計師的喜愛,很多人都喜歡使用XML格式傳輸資料或者作為程式的配置資訊。現在我將來實現在iOS中解析XML格式資料,語言使用Swift。

     首先自己寫一個簡單的XML:

<data>
   <person age="15">zhangsan</person>
   <person age="2">lisi</person>
   <person>wangwu</person>

   <a>
       <b>
           <c>many people</c>
       </b>
   </a>

</data>
先把這個XML寫成一個檔案 data.xml存放在Supporting Files中,在程式中進行讀取。

(1)首先在這個ViewController中實現一個委託:NSXMLParserDelegate。然後在viewDidLoad()中讀取xml檔案。viewDidLoad()方法實現如下:

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        var parser = NSXMLParser(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("data", ofType: "xml")!))
        
        parser!.delegate = self
        parser!.parse()
        
    }

(2)然後讀取頭結點值,如<data>,<person>,<a>,<b>,<c>.要實現一個parse()方法:

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
        
        println(elementName)    //輸出每一個頭結點;如data,person,person,a,b,c;
        
    }
實現結果如下:符合我們的預期。


(3)然後嘗試讀取屬性值,如XML中的age。也是在上述的parse()方法中進行實現。程式碼如下:

    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
        
        if elementName == "person"{
        
            if let age: AnyObject = attributeDict["age"]{
            
                println("age = \(age)")
            }
            
        }
    }
輸出結果如下:


(4)最後我們要一起讀取節點值和裡面包含的鍵值。需要在NSXMLParserDelegate委託中再重寫一個parse方法,其中兩個重寫parse方法如下:

    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
        
        currentNodeName = elementName
        
    }
    
    func parser(parser: NSXMLParser, foundCharacters string: String?) {
        
        var str  = string?.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
            if str != ""{
                println("current node= \(currentNodeName),value=\(str!)")
            }
        }
    
最後的輸出結果如下:符合·預期的結果。


(5)整個程式的程式碼如下,裡面有比較詳細的註釋:

import UIKit

class ViewController: UIViewController ,NSXMLParserDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //從data.xml中讀取內容
        var parser = NSXMLParser(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("data", ofType: "xml")!))
        
        parser!.delegate = self  //使用xml解析的委託,需要重寫方法;
        parser!.parse()
        
    }

    var currentNodeName:String! // 等下記錄當前讀取到的節點名稱;
    
    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
        
        println(elementName)    //輸出每一個頭結點;如data,person,person,a,b,c;
        
        currentNodeName = elementName
        
        if elementName == "person"{//讀取某個節點下的屬性值,如person下有age屬性;
        
            //可能有些person節點沒有age屬性,需要使用if來進行判斷;否則在讀取沒有age的節點時會報錯;
            if let age: AnyObject = attributeDict["age"]{
            
                println("age = \(age)")
            }
            
        }
    }
    
    func parser(parser: NSXMLParser, foundCharacters string: String?) {
        
        // 在整個xml檔案的讀取中,空格也會被以字串的形式讀取。所以需要刪除空行和空格;
        //string 就是這個節點的鍵值;
        var str  = string?.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
        //還需要判斷這個鍵值是否為空,因為有些頭尾節點之間並沒有值:如  <d></d>等等;
            if str != ""{
                println("current node= \(currentNodeName),value=\(str!)")
            }
        }
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}


       其實需要解析xml用得最多的地方就是客戶端用SOAP去訪問WebService,此時WebService很多返回的都是xml。



github主頁:https://github.com/chenyufeng1991  。歡迎大家訪問!

相關文章