Swift学习笔记(2)网络数据交换格式(XML,JSON)解析 [iOS实战 入门与提高卷]

简介: Swift学习笔记(2)网络数据交换格式(XML,JSON)解析参考书籍及资源:iOS实战 入门与提高卷 关东升 参考书籍地址用NSXML来解析XML文档用TBXML来解析XML文档用NSJSONSerialization来解析JSON文档目录Swift学习笔记2网络数据交换格式XMLJSON解析目录用NSXML来解析XML文档

Swift学习笔记(2)网络数据交换格式(XML,JSON)解析

参考书籍及资源:iOS实战 入门与提高卷 关东升 参考书籍地址

  • 用NSXML来解析XML文档
  • 用TBXML来解析XML文档
  • 用NSJSONSerialization来解析JSON文档

目录


用NSXML来解析XML文档

NSXML是iOS SDK自带的,也是苹果默认的解析框架,框架的核心是NSXMLParser和它的委托协议NSXMLParserDelegate。

示例文档Notes.xml

<?xml version="1.0" encoding="UTF-8"?>
<Notes>
  <Note id="1">
    <CDate>2014-12-21</CDate>
    <Content>早上8点钟到公司</Content>
    <UserID>tony</UserID>
  </Note>
  <Note id="2">
    <CDate>2014-12-22</CDate>
    <Content>发布iOSBook1</Content>
    <UserID>tony</UserID>
  </Note>
  <Note id="3">
    <CDate>2014-12-23</CDate>
    <Content>发布iOSBook2</Content>
    <UserID>tony</UserID>
  </Note>
  <Note id="4">
    <CDate>2014-12-24</CDate>
    <Content>发布iOSBook3</Content>
    <UserID>tony</UserID>
  </Note>
  <Note id="5">
    <CDate>2014-12-25</CDate>
    <Content>发布2016奥运会应用iPhone版本</Content>
    <UserID>tony</UserID>
  </Note>
  <Note id="6">
    <CDate>2014-12-26</CDate>
    <Content>发布2016奥运会应用iPad版本</Content>
    <UserID>tony</UserID>
  </Note>
</Notes>

创建XMLParser类

import Foundation

class XMLParser: NSObject , NSXMLParserDelegate {

    private var notes:NSMutableArray! = []
    private var currentTagName:String!

    func startParse(){
        NSLog("start parse")

        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)")
    }
}

调用与运行结果

override func viewDidLoad() {
        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来解析XML文档

TBXML是第三方框架,使用起来比NSXML更简单。

准备工作

TBXML下载地址

下载完成后将TBXML-Headers和TBXML-Code文件夹添加到工程中,并添加以下Framewok和库
这里写图片描述

在Xcode6以后的版本,需要创建PrefixHeader.pch文件
这里写图片描述

并选择TARGETS->工程名->Buil Setting->Apple LLVM x.x Language ->Prefix Header,输入PrefixHeader.pch
这里写图片描述

在PrefixHeader.pch中添加以下代码

#import <Foundation/Foundation.h>
#define ARC_ENABLED

在桥接头文件中添加以下代码(关于桥接头文件请参考Swift和Objective-C的混编)

#import <Foundation/Foundation.h>
#import "TBXML.h"

创建XMLParser类

import Foundation

class XMLParser: NSObject {

    private var notes:NSMutableArray! = []

    func startParse(){
        NSLog("start parse")

        self.notes=NSMutableArray()
        let tbxml=(try? TBXML(XMLFile: "Notes.xml",error:()))!
        //获取XML文档根元素
        let root=tbxml.rootXMLElement

        if root != nil{
            //查找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
    }

}

调用与运行结果

同上

用NSJSONSerialization来解析JSON文档

NSJSONSerialization是iOS 5之后苹果提供的API。

示例文档 Notes.data

{"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"}]}

示例代码

import UIKit

class ViewController: UIViewController {

    var objects:NSMutableArray!=[]

    override func viewDidLoad() {
        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.
    }


}

运行结果

目录
相关文章
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
783 27
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
756 4
JSON数据解析实战:从嵌套结构到结构化表格
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
580 4
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
805 3
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
453 20
|
缓存 监控 搜索推荐
【实战解析】smallredbook.item_get_video API:小红书视频数据获取与电商应用指南
本文介绍小红书官方API——`smallredbook.item_get_video`的功能与使用方法。该接口可获取笔记视频详情,包括无水印直链、封面图、时长、文本描述、标签及互动数据等,并支持电商场景分析。调用需提供`key`、`secret`和`num_iid`参数,返回字段涵盖视频链接、标题、标签及用户信息等。同时,文章提供了电商实战技巧,如竞品监控与个性化推荐,并列出合规注意事项及替代方案对比。最后解答了常见问题,如笔记ID获取与视频链接时效性等。
|
数据可视化 测试技术 API
GraphQL开发工具选型指南:Apipost高效调试与文档生成实战解析
本文深入解析了GraphQL开发工具Apipost在高效调试与文档生成方面的优势,对比同类工具Apifox,突出其可视化界面、实时调试及自动化文档生成等特性。Apipost通过智能代码补全、错误提示等功能简化复杂Query编写,支持一键生成标准化文档,显著提升开发效率和团队协作效果,尤其适合中大型团队应对复杂业务场景。
|
Swift
《Swift入门经典(第2版)》——2.5 问与答
本节书摘来自异步社区《Swift入门经典(第2版)》一书中的第2章,第2.5节,作者:【美】BJ Miller(BJ 米勒)著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1668 0
|
iOS开发 Swift
《Swift入门经典(第2版)》——1.4 问与答
在许多Mac和iOS应用中仍在大量使用Objective-C,并且在接下来一段时间仍然会使用它。本书主要讲述Swift编程语言,但是如果你希望成为一名全职开发人员或者具有某种能力,就可能在现有的代码库中遇到Objective-C代码,因此学习一些Objective-C知识可能会从中获益。
1479 0
|
iOS开发 Swift
《Swift入门经典(第2版)》——1.3 小结
本节书摘来自异步社区《Swift入门经典(第2版)》一书中的第1章,第1.3节,作者:【美】BJ Miller(BJ 米勒)著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1442 0

推荐镜像

更多
  • DNS