XML格式的数据是一种数据的传输格式。因为它方便编写。结构清晰,所以深受程序猿的喜爱,非常多人都喜欢使用XML格式数据传输或者作为程序的配置信息。

如今我将来实如今iOS中解析XML格式数据,语言使用Swift。

首先自己写一个简单的XML:

  1. <data>
  2. <person age="15">zhangsan</person>
  3. <person age="2">lisi</person>
  4. <person>wangwu</person>
  5.  
  6. <a>
  7. <b>
  8. <c>many people</c>
  9. </b>
  10. </a>
  11.  
  12. </data>

先把这个XML写成一个文件 data.xml存放在Supporting Files中,在程序中进行读取。

(1)首先在这个ViewController中实现一个托付:NSXMLParserDelegate。然后在viewDidLoad()中读取xml文件。viewDidLoad()方法实现例如以下:

  1. override func viewDidLoad() {
  2. super.viewDidLoad()
  3. // Do any additional setup after loading the view, typically from a nib.
  4.  
  5. var parser = NSXMLParser(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("data", ofType: "xml")!))
  6.  
  7. parser!.delegate = self
  8. parser!.parse()
  9.  
  10. }

(2)然后读取头结点值,如<data>,<person>,<a>,<b>,<c>.要实现一个parse()方法:

  1. func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
  2.  
  3. println(elementName) //输出每个头结点;如data。person,person,a,b,c;
  4.  
  5. }

实现结果例如以下:符合我们的预期。

(3)然后尝试读取属性值,如XML中的age。

也是在上述的parse()方法中进行实现。

代码例如以下:

  1. func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?
  2.  
  3. , attributes attributeDict: [NSObject : AnyObject]) {
  4.  
  5. if elementName == "person"{
  6.  
  7. if let age: AnyObject = attributeDict["age"]{
  8.  
  9. println("age = \(age)")
  10. }
  11.  
  12. }
  13. }

输出结果例如以下:

(4)最后我们要一起读取节点值和里面包括的键值。

须要在NSXMLParserDelegate托付中再重写一个parse方法。当中两个重写parse方法例如以下:

  1. func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?
  2.  
  3. , qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
  4.  
  5. currentNodeName = elementName
  6.  
  7. }
  8.  
  9. func parser(parser: NSXMLParser, foundCharacters string: String?
  10.  
  11. ) {
  12.  
  13. var str = string?.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
  14. if str != ""{
  15. println("current node= \(currentNodeName),value=\(str!)")
  16. }
  17. }

最后的输出结果例如以下:符合·预期的结果。

(5)整个程序的代码例如以下。里面有比較具体的凝视:

  1. import UIKit
  2.  
  3. class ViewController: UIViewController ,NSXMLParserDelegate{
  4.  
  5. override func viewDidLoad() {
  6. super.viewDidLoad()
  7.  
  8. //从data.xml中读取内容
  9. var parser = NSXMLParser(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("data", ofType: "xml")!))
  10.  
  11. parser!.delegate = self //使用xml解析的托付。须要重写方法;
  12. parser!.parse()
  13.  
  14. }
  15.  
  16. var currentNodeName:String! // 等下记录当前读取到的节点名称;
  17.  
  18. func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
  19.  
  20. println(elementName) //输出每个头结点;如data。person,person,a,b,c;
  21.  
  22. currentNodeName = elementName
  23.  
  24. if elementName == "person"{//读取某个节点下的属性值。如person下有age属性;
  25.  
  26. //可能有些person节点没有age属性,须要使用if来进行推断;否则在读取没有age的节点时会报错;
  27. if let age: AnyObject = attributeDict["age"]{
  28.  
  29. println("age = \(age)")
  30. }
  31.  
  32. }
  33. }
  34.  
  35. func parser(parser: NSXMLParser, foundCharacters string: String?) {
  36.  
  37. // 在整个xml文件的读取中,空格也会被以字符串的形式读取。所以须要删除空行和空格;
  38. //string 就是这个节点的键值;
  39. var str = string?
  40.  
  41. .stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
  42. //还须要推断这个键值是否为空。由于有些头尾节点之间并没有值:如 <d></d>等等。
  43. if str != ""{
  44. println("current node= \(currentNodeName),value=\(str!)")
  45. }
  46. }
  47.  
  48. override func didReceiveMemoryWarning() {
  49. super.didReceiveMemoryWarning()
  50. }
  51.  
  52. }

事实上须要解析xml用得最多的地方就是client用SOAP去訪问WebService,此时WebService非常多返回的都是xml。

github主页:https://github.com/chenyufeng1991  。欢迎大家訪问!

iOS开发之解析XML格式数据的更多相关文章

  1. Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  2. 解析XML格式数据

    学习解析XML格式的数据前,搭建一个简单的web服务器,在这个服务器上提供xml文本用于练习. 一.搭建Apache服务器 在Apache官网下载编译好的服务器程序,安装.对于Windows来说127 ...

  3. ios网络学习------8 xml格式数据的请求处理 用代码块封装

    #pragma mark 载入xml - (void)loadXML { //获取网络数据. NSLog(@"load xml"); //从webserver载入数据 NSStri ...

  4. Swift - 解析XML格式数据(分别使用GDataXML和DDXML)

    在做一些应用的时候经常需要用到XML解析,比如获取Web Service数据,读取RSS新闻或者博客数据源.下面演示了两个非常方便高效的XML库在Swift里的调用方法. 假设需要被解析的XML数据文 ...

  5. rabbitmq - 消息接收,解析xml格式数据时异常:ERROR not well-formed (invalid token): line 4, column 46

    ERROR alsv odoo.addons.cus_alsv.utils.alsv_about_mq.get_data_from_mq: parse_xml_data_from_mq: not we ...

  6. iOS开发网络篇—XML数据的解析

     iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是 ...

  7. (5)微信二次开发 之 XML格式数据解析

    1.首先理解一下html html的全名是:HyperText Transfer markup language 超级文本标记语言,html本质上是一门标记(符合)语言,在html里,这些标记是事先定 ...

  8. scrapy 解析xml格式的数据

    XMLFeedSpider 主要用于 解析 xml格式的数据 创建一个scrapy 项目文件 scrapy startproject xxx 创建一个spider scrapy genspider - ...

  9. ios网络学习------6 json格式数据的请求处理

    ios网络学习------6 json格式数据的请求处理 分类: IOS2014-06-30 20:33 471人阅读 评论(3) 收藏 举报 #import "MainViewContro ...

随机推荐

  1. [SCOI2011][bzoj2331] 地板 [插头dp]

    题面: 传送门 思路: 插头dp基础教程 这个L形......第一眼看上去真的是丧病啊 但是仔细想想,实际上也就是拿一堆路径铺满一个棋盘,这个路径还是有限制的 那还有什么好说的,插头dp上啊[雾] 首 ...

  2. sqlmap post注入两种方式

    1. 使用抓包工具抓取数据包,sqlmap加载数据包 POST /SME/static/orderFind/orderIntfaceph HTTP/1.1 Host: abc.com User-Age ...

  3. 使用PropTypes进行类型检测

    PropTypes 是react提供的用于检验数据类型的typechecking,避免应用越来越大的时候出现意料之外的bug class Greeting extends React.Componen ...

  4. 容易混淆的某些Math方法说明

    1. Math.round 返回最接近的整数值,实际上就是我们说的对小数进行四舍五入. /** * 返回最接近参数的long */ static long round(double a) /** * ...

  5. android基本控件学习-----Button

    Button讲解: 一.在我们实际的使用button的时候经常会对button不同状态会有不同的显示,在讲解Button前,首先对drawable下面的statelistdrawable的相关知识讲一 ...

  6. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---4

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...

  7. hdu 3639 有向图缩点+建反向图+搜索

    题意:给个有向图,每个人可以投票(可以投很多人,一次一票),但是一个人只能支持一人一次,支持可以传递,自己支持自己不算,被投支持最多的人. 开始想到缩点,然后搜索,问题是有一点想错了!以为支持按票数计 ...

  8. [Python Cookbook] Numpy Array Slicing and Indexing

    1-D Array Indexing Use bracket notation [ ] to get the value at a specific index. Remember that inde ...

  9. JMeter特殊情况二:针对某些请求数据每次请求都是变化的情况

    概要:某些post请求,例如,登录的请求除了有我们再页面上需要输入的一些值(用户名.密码.是否记住密码等)之外,还有其他的参数,例如token等等,而且这些参数不固定,也就是说每一次post请求这些参 ...

  10. httperf+autobench测试web应用

    测试性能相关的概念理解 httperf使用 主页:  http://www.hpl.hp.com/research/linux/httperf/ 下载: http://httperf.googleco ...