1. 程式人生 > >iOS開發之解析XML格式數據

iOS開發之解析XML格式數據

trac pri dsta service ext inset ech dna 們的

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用得最多的地方就是client用SOAP去訪問WebService,此時WebService非常多返回的都是xml。



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


iOS開發之解析XML格式數據