您的位置:首页 > 移动开发 > IOS开发

iOS开发之解析XML格式数据

2015-08-06 22:46 459 查看
     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  。欢迎大家访问!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: