使用swift原生库解析xml数据 -九游会j9官网ag登录入口

0顶
0踩

使用swift原生库解析xml数据

2015-12-17 17:55 by 副主编 mengyidan1988 评论(1) 有6925人浏览
在实现文件操作的时候我意识到了一个事实:由于nsurl是可支持的路径,很多文件的操作实际上可以扩充到网络上去,比如从网上下载一个文件、拿取一些数据……想到这里,埋藏在心中很久的愿望又开始蠢蠢欲动:写一个新闻客户端!
我有一个常看的新闻网站(不要问我是哪个,要fq),官方客户端很难用,第三方广告满天飞,严重影响心情。所以当初开始学ios的时候就把重做一个客户端的目标放在了首位。最开始的时候想得太简单,兴冲冲地开了个project,搞了两下tableview,然后发现……对于我这种从来只写底层代码,swift/oc语法都不会的人,做这个简直是异想天开好嘛!
折腾的过程中,为了拿到数据,还跑去下了android的官方客户端反编译,find grep出来了人家的数据接口地址(论一个爱折腾的程序员是怎么给自己挖坑的),返回的是xml数据,连蒙带猜试了试,可以用!不过后来做ui受挫(其实不止做ui,挫败感太大),就把那份东西闲置起来了。这两天突然想起来,现在我貌似感觉有点良好,何不捡起来继续写我的客户端?
因为ui我还一窍不通,不懂怎么调试,也不懂怎么把数据显示出来,为了避免到处打印的麻烦,我选择playground。这样也就是需要用原生库,这个很简单,搜一下就有了:nsxmlparserdelegate,还有好些源码,虽然大多是oc的。
问题是有源码,我依!然!看!不!懂!怎么用!每个教程都是扔了源码上来,可没人解释清楚到底怎么运行。我研究了好一阵,终于明白了大概的机制:
引用
自己写一个类继承nsxmlparserdelegate,就叫它xmlreader吧;并且实现一些必须的callback函数,在xmlreader的init中调用.parse()方法,最后在new xmlreader的时候就会自动完成整个parse了

当然你也可以不把parse()放在init()中调用,而是在new了xmlreader之后强制调用,重要的是那些callback函数的实现。xmlreader中还可以声明一些变量,来保存解析过程中的状态,而具体的获得到的数据填充,也是需要你自己做的(数据结构自行定义)。
鉴于xml是一个有层级的带递归意味的数据结构,程序会层层解析下去直到结束,中间遇到的各种类似section开始、结束、拿到字符串等情况都会call一个固定的函数,将解析出来的数据作为参数传进去,而你要做的,就是实现这些callback以完成自己想要做的事。
下面是具体的代码示范。首先是定义一个新的类:
class xmlreader: nsobject, nsxmlparserdelegate {
var currentname :string? = nil
var level :int = 0
 init(add :string ) {
    super.init()
    let url = ns!
    guard let parserxml = nsxmlparser(contentsofurl: url) else {
        return
    }
    parserxml.delegate = self
    parserxml.parse()
    }
func parserdidstartdocument(parser: nsxmlparser) {}
func parserdidenddocument(parser: nsxmlparser){}
func parser(parser: nsxmlparser, didstartelement elementname: string, namespaceuri: string?, qualifiedname qname: string?, attributes attributedict: [string : string]) {}
func parser(parser: nsxmlparser, didendelement elementname: string, namespaceuri: string?, qualifiedname qname: string?) {}
func parser(parser: nsxmlparser, var foundcharacters string: string) {}
func parser(parser: nsxmlparser, parseerroroccurred parseerror: nserror) {}
}

这是一个基础部分,里面定义了一些callback但没有实现它。我把xml的地址作为参数传给了init(),并且声明了两个变量currentname和level分别用来保存当前的标签名字和递归深度。然后我们基于下面这个简单的xml文件继续完成callback部分:


    
        c#
        vs
    
    


首先是文档开始和结束时:
//文档开始解析时触发,只触发一次
func parserdidstartdocument(parser: nsxmlparser) {
    print("    start")
}
//文档结束时触发,只触发一次,通常需要在这里给出一个信号告诉上层或其他人解析已经结束
func parserdidenddocument(parser: nsxmlparser){
    print("    end")
}

然后是标签的开始和结束事件:
//遇到一个开始标签触发,elementname为当前标签,如果当前标签有属性,则字典sttributedict不为空
func parser(parser: nsxmlparser, didstartelement elementname: string, namespaceuri: string?, qualifiedname qname: string?, attributes attributedict: [string : string]()) {
    self.currentname = elementname
    self.level  
    print("\(level) start, \(elementname), \(attributedict)")
    if currentname == "language" { // 获取language属性的内容
        //print("language: \(attributedict)")
    }
}
//遇到结束标签触发,该方法主要是做一些清理工作,在这里我修改了当前的深度
func parser(parser: nsxmlparser, didendelement elementname: string, namespaceuri: string?, qualifiedname qname: string?) {
    print("\(level) end, \(elementname)")
    self.currentname = nil
    self.level--
}

接下来是字符串值的handler
// 遇到字符串时触发
func parser(parser: nsxmlparser, var foundcharacters string: string) {
    //删除首尾的回车符和空格
    string = string.stringbytrimmingcharactersinset(nscharacterset.whitespaceandnewlinecharacterset())
    if string.isempty {
        return
    }
    print("---- \(string)")
}

最后是error handler
// 文档出错时触发
func parser(parser: nsxmlparser, parseerroroccurred parseerror: nserror) {
    print(parseerror)
}

以上的callback函数实现都只放了些打印信息,在实际操作中需要把这些获取的信息一一填充进自己的数据结构中。说实话是挺麻烦的,难怪都说xml快要被json全面取代(其实对于曾被libxml折磨过的码农来说,这已经挺好了)。全部的代码传送门:

本文转自:
来自:
0
0
评论 共 1 条 请登录后发表评论
1 楼 2015-12-18 10:15
程序员群 2177712 

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • xmlparser解析 1.xml数据 <?xml version="1.0" encoding="utf-8" standalone="no"?> <person id="1"> <name>xiaopao</name> <age>21</age> </person> ...

  • 对于接触过ios解析xml的应该很多吧…我是写android的我司项目会涉及到很多xml解析导出给cad然后cad解析完成之后进行绘制编辑等。原生android有很多对于xml的解析方式[sax,pull,dom等],flutter的对于xml解析很少了...

  • 最近公司的活比较少,空闲时间...在这个过程中便有使用到xml数据,于是研究了一下。目前写的这个是本地阅读软件,后续会把在写这个app用到的技术以及遇到的问题都整理出来,通过博客的形式分享给大家。奇迹读书地址。

  • apple 终于在 swift 4 的 foundation 的模块中添加了对 json 解析的原生支持。 虽然已经有很多第三方类库实现了 json 解析,但是能够看到这样一个功能强大、易于使用的官方实现还是不免有些兴奋。 值得注意的是,...

  • apple 终于在 swift 4 的 foundation 的模块中添加了对 json 解析的原生支持。 虽然已经有很多第三方类库实现了 json 解析,但是能够看到这样一个功能强大、易于使用的官方实现还是不免有些兴奋。 值得注意的是,...

  • apple 终于在 swift 4 的 foundation 的模块中添加了对 json 解析的原生支持。 虽然已经有很多第三方类库实现了 json 解析,但是能够看到这样一个功能强大、易于使用的官方实现还是不免有些兴奋。 值得注意的是,...

  • swift学习资料@swiftguide很赞 的swift学习资料leetcode一个练习、评估自己水平的代码平台,跟acm有点类似完整app@swift 30 projects- 最新 swift 3.0 的30个小app,更注重代码规范和架构设计(故胤道长)v2ex-swift- ...

  • 最近公司项目中使用了本地存储,所以趁着周六日来整理一下在swift中的几种数据存储方式。一、plist文件存储存储目录:documents每次在xcode中新建一个ios项目后,都会自己产生一个.plist文件,里面记录项目的一些...

  • 读取与解析json类型数据 一、什么是json? json(javascript object notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式, 是理想的数据交换格式,同时,json是 javascript 原生格式。 非常...

  • 如之前的文章所述,我司下半年成立大模型项目团队之后,我兼管整个项目团队,但为让项目的推进效率更高,故分成了三大项目组对于知识库问答,现在有两种方案,一种基于llamaindex,一种基于langchain llm,考虑到我...

  • swift版本点击这里欢迎加入交qq流群: 594119878github排名 https://github.com/trending,github搜索:https://github.com/search使用方法:根据目录关键字搜索,记得包含@,以保证搜索目录关键字的唯一性。...

  • (2)服务器返回给客户端的数据,一般都是json格式或者xml格式(文件下载除外) 002 相关说明 (1)json的格式很像oc中的字典和数组 (2)标准json格式key必须是双引号 003 json解析方案

  • python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。python社区提供了大量的第三方库,如numpy、pandas和requests,极大地丰富了python的应用领域,从数据科学到web开发。python库的丰富性是python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,matplotlib和seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

  • stm32单片机fpga毕设电路原理论文报告基于ide硬盘的数字图像存储技术研究本资源系百度网盘分享地址

  • 适合rust入门。深入浅出,事无巨细,远胜市面上所有入门书。而且是免费的

  • vb语言vb房屋租凭管理系统毕业设计(源代码 系统)本资源系百度网盘分享地址

  • 这个示例代码,我们实现了一个用 c 语言判断一个数是否为素数的函数,并通过 main() 函数来测试这个函数。整个过程简单明了,代码结构清晰,易于理解和修改。这个示例展示了 c 语言中函数的定义和调用,以及条件判断和循环等基本语法的使用。

  • 层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例

  • 1、嵌入式物联网单片机项目开发实战,每个例程都经过实战检验,简单好用。 2、代码同系列芯片理论是通用的。其他单片机型号请自行更改。 3、软件下载时,请注意下载方式以及对应的下载工具。 4、技术v:wulianjishu666; 5、如果接入其他传感器,请查看发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。

  • 四脚板凳u型焊接端子冲压成形机sw18可编辑_零件图_机械工程图_机械三维3d建模图打包下载.zip

global site tag (gtag.js) - google analytics
网站地图