iOS开发之解析XML格式数据
2015-08-06 22:46
459 查看
XML格式的数据是一种数据的传输格式,由于它方便编写,结构清晰,所以深受程序员的喜爱,很多人都喜欢使用XML格式传输数据或者作为程序的配置信息。现在我将来实现在iOS中解析XML格式数据,语言使用Swift。
首先自己写一个简单的XML:
(1)首先在这个ViewController中实现一个委托:NSXMLParserDelegate。然后在viewDidLoad()中读取xml文件。viewDidLoad()方法实现如下:
(2)然后读取头结点值,如<data>,<person>,<a>,<b>,<c>.要实现一个parse()方法:
。
(3)然后尝试读取属性值,如XML中的age。也是在上述的parse()方法中进行实现。代码如下:
。
(4)最后我们要一起读取节点值和里面包含的键值。需要在NSXMLParserDelegate委托中再重写一个parse方法,其中两个重写parse方法如下:
。
(5)整个程序的代码如下,里面有比较详细的注释:
其实需要解析xml用得最多的地方就是客户端用SOAP去访问WebService,此时WebService很多返回的都是xml。
github主页:https://github.com/chenyufeng1991 。欢迎大家访问!
首先自己写一个简单的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 。欢迎大家访问!
相关文章推荐
- iOS开发 - Xcode升级失效解决办法
- ios代理的使用,正向传值,逆向传值
- iOS设计模式之命令模式
- iOS 透明视图控制器
- iOS 使用category将复杂的类拆分
- iOS 9之分屏多任务(Split View)
- iOS设计模式 - 单例
- ios越狱开发随感
- IOS性能优化
- iOS Core Animation详解(四)AutoLayout中的动画
- ios7 textViewDidChange代理/通知中修改TextView内容崩溃的原因
- ios 设计 切图
- ios给图片加水印
- xcode6插件地址(某些插件不能用解决办法)
- iOS开发-Day19-OC NSDictionary&NSMutableDictionary&NSSet&NSMutableSet
- iOS 第四课 倒计时 设置文本框的删除键
- iOS让程序延迟执行
- iOS 第三课 podfile文件 makeToast第三方错误提示 正则NSPredicate
- iOS程序启动的时候隐藏状态栏,启动完成之后显示状态栏
- iOS 设置导航栏的主题