Swift学习笔记(2)网络数据交换格式(XML,JSON)解析 [iOS实战 入门与提高卷]
2023-09-14 09:04:37 时间
NSXML是iOS SDK自带的,也是苹果默认的解析框架,框架的核心是NSXMLParser和它的委托协议NSXMLParserDelegate。
let path=NSBundle.mainBundle().pathForResource("Notes", ofType: "xml")! let url=NSURL(fileURLWithPath: path) //开始解析 let parser=NSXMLParser(contentsOfURL: url)! parser.delegate=self parser.parse() //文档开始时触发 func parserDidStartDocument(parser: NSXMLParser) { self.notes=NSMutableArray() //文档出错时触发 func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) { NSLog("%@", parseError) //遇到一个开始标签时触发,其中namespaceURI是命名空间,qualifiedName是限定名,attributes是字典属性集合 func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { self.currentTagName=elementName if self.currentTagName == "Note"{ let id=attributeDict["id"]! as NSString let dict=NSMutableDictionary() dict.setObject(id, forKey: "id") self.notes.addObject(dict) //遇到字符串时触发 func parser(parser: NSXMLParser, foundCharacters string: String) { //去除空格和回车 let s1 = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) if s1 == ""{ return let dict = self.notes.lastObject as! NSMutableDictionary if (self.currentTagName == "CDate"){ dict.setObject(string, forKey: "CDate") if (self.currentTagName == "Content"){ dict.setObject(string, forKey: "Content") if (self.currentTagName == "UserID"){ dict.setObject(string, forKey: "UserID") //遇到结束标签时触发 func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { self.currentTagName=nil //文档结束时触发 func parserDidEndDocument(parser: NSXMLParser) { NSLog("end parse") NSLog("\(notes)") }
super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let parser=XMLParser() parser.startParse()
2016-05-17 12:03:42.836 XMLTest[61377:445073] start parse 2016-05-17 12:03:42.852 XMLTest[61377:445073] end parse 2016-05-17 12:03:42.853 XMLTest[61377:445073] ( CDate = "2014-12-21"; Content = "\U65e9\U4e0a8\U70b9\U949f\U5230\U516c\U53f8"; UserID = tony; id = 1; CDate = "2014-12-22"; Content = "\U53d1\U5e03iOSBook1"; UserID = tony; id = 2; CDate = "2014-12-23"; Content = "\U53d1\U5e03iOSBook2"; UserID = tony; id = 3; CDate = "2014-12-24"; Content = "\U53d1\U5e03iOSBook3"; UserID = tony; id = 4; CDate = "2014-12-25"; Content = "\U53d1\U5e032016\U5965\U8fd0\U4f1a\U5e94\U7528iPhone\U7248\U672c"; UserID = tony; id = 5; CDate = "2014-12-26"; Content = "\U53d1\U5e032016\U5965\U8fd0\U4f1a\U5e94\U7528iPad\U7248\U672c"; UserID = tony; id = 6;
下载完成后将TBXML-Headers和TBXML-Code文件夹添加到工程中,并添加以下Framewok和库
在Xcode6以后的版本,需要创建PrefixHeader.pch文件
并选择TARGETS- 工程名- Buil Setting- Apple LLVM x.x Language - Prefix Header,输入PrefixHeader.pch
在PrefixHeader.pch中添加以下代码
//查找root元素下的Note元素 var noteElement=TBXML.childElementNamed("Note", parentElement: root) while noteElement != nil{ let dict=NSMutableDictionary() //查找Note元素下的CDate元素 let CDateElemet=TBXML.childElementNamed("CDate", parentElement: noteElement) if CDateElemet != nil{ let CDate=TBXML.textForElement(CDateElemet) dict.setValue(CDate, forKey: "CDate") //查找Note元素下的Content元素 let ContentElemet=TBXML.childElementNamed("Content", parentElement: noteElement) if ContentElemet != nil{ let Content=TBXML.textForElement(ContentElemet) dict.setValue(Content, forKey: "Content") //查找Note元素下的UserID元素 let UserIDElemet=TBXML.childElementNamed("UserID", parentElement: noteElement) if UserIDElemet != nil{ let UserID=TBXML.textForElement(UserIDElemet) dict.setValue(UserID, forKey: "UserID") //获取Note元素的id属性值 let id=TBXML.valueOfAttributeNamed("id", forElement: noteElement) dict.setValue(id, forKey: "id") self.notes.addObject(dict) //获取同层的下一个Note元素 noteElement=TBXML.nextSiblingNamed("Note", searchFromElement: noteElement) NSLog("end parse") NSLog("\(notes)") self.notes=nil
{"ResultCode":0,"Record":[ {"ID":"1","CDate":"2014-12-23","Content":"发布iOSBook0","UserID":"tony"}, {"ID":"2","CDate":"2014-12-24","Content":"发布iOSBook1","UserID":"tony"}, {"ID":"3","CDate":"2014-12-25","Content":"发布iOSBook2","UserID":"tony"}, {"ID":"4","CDate":"2014-12-26","Content":"发布iOSBook3","UserID":"tony"}, {"ID":"5","CDate":"2014-12-27","Content":"发布iOSBook4","UserID":"tony"}, {"ID":"6","CDate":"2014-12-28","Content":"发布iOSBook5","UserID":"tony"}, {"ID":"7","CDate":"2014-12-29","Content":"发布iOSBook6","UserID":"tony"}, {"ID":"8","CDate":"2014-12-30","Content":"发布iOSBook7","UserID":"tony"}, {"ID":"9","CDate":"2014-12-31","Content":"发布iOSBook8","UserID":"tony"}, {"ID":"10","CDate":"2014-12-32","Content":"发布iOSBook9","UserID":"tony"}, {"ID":"11","CDate":"2014-12-33","Content":"发布iOSBook10","UserID":"tony"}, {"ID":"12","CDate":"2014-12-34","Content":"发布iOSBook11","UserID":"tony"}, {"ID":"13","CDate":"2014-12-35","Content":"发布iOSBook12","UserID":"tony"}, {"ID":"14","CDate":"2014-12-36","Content":"发布iOSBook13","UserID":"tony"}, {"ID":"15","CDate":"2014-12-37","Content":"发布iOSBook14","UserID":"tony"}, {"ID":"16","CDate":"2014-12-38","Content":"发布iOSBook15","UserID":"tony"}, {"ID":"17","CDate":"2014-12-39","Content":"发布iOSBook16","UserID":"tony"}, {"ID":"18","CDate":"2014-12-40","Content":"发布iOSBook17","UserID":"tony"}, {"ID":"19","CDate":"2014-12-41","Content":"发布iOSBook18","UserID":"tony"}, {"ID":"20","CDate":"2014-12-42","Content":"发布iOSBook19","UserID":"tony"}, {"ID":"21","CDate":"2014-12-43","Content":"发布iOSBook20","UserID":"tony"}, {"ID":"22","CDate":"2014-12-44","Content":"发布iOSBook21","UserID":"tony"}]}
super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let path=NSBundle.mainBundle().pathForResource("Notes", ofType: "json")! let jsonData=NSData(contentsOfFile: path)! //MutableContainers指定解析返回的是可变的数组或字典 let jsonObj:NSDictionary=(try? NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers)) as! NSDictionary self.objects=jsonObj.objectForKey("Record") as! NSMutableArray NSLog("\(self.objects)") override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated.
相关文章
- ios app在itunesConnect里面的几种状态
- iOS应用IAP设置总结
- 移动端 ios 长按复制兼容方案
- iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
- iOS开发之网络编程--获取文件的MIMEType
- iOS开发网络篇—搭建本地服务器(待整理)
- iOS设计模式 - 代理
- iOS开发网络数据之AFNetworking使用
- IOS runtime动态运行时二
- uniapp判断当前环境是ios还是android
- 关闭IOS更新功能(ios4/5/6)
- iOS中 UIWebView加载网络数据 技术分享
- iOS网络编程-iCloud文档存储编程实例
- iOS网络编程-iCloud键值数据存储编程实例
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS swift 协议的可选方法
- iOS 网络 HTTP(Hyper Text Transfer Protocol)超文本传输协议
- ios LaunchScreen启动页国际化(本地化)
- iOS swift Error Handling(throw trows)
- iOS @2x @3x图的区别和理解
- iOS开发--漫谈内存管理(一)
- IOS的一个带动画的多项选择的控件(一)
- iOS开发RunTime之函数调用