iOS開發之解析XML格式數據
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>
(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格式數據