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

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

首先自己写一个简单的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用得最多的地方就是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. loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】

    题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...

  2. 【WC2019笔记】模拟费用流算法

    在一条数轴上,有 $n$ 只老鼠和 $m$ 个老鼠洞. Q1 每只老鼠都只能往左走,求所有老鼠都进洞的最小代价(代价就是所有老鼠走的距离和). 每个洞只能进一只老鼠. A1 一开始陈江伦老师没说每个洞 ...

  3. nginx问题

    1.杀死nginx之后,找不到pid http://bbs.pxecn.com/thread-122116-1-1.html

  4. bzoj 3704 昊昊的机油之GRST 贪心dp,思维

    昊昊的机油之GRST Time Limit: 10 Sec  Memory Limit: 1024 MBSubmit: 80  Solved: 33[Submit][Status][Discuss] ...

  5. ClassLoader 提供了两个方法用于从装载的类路径中取得资源:

    转:http://cheneyph.iteye.com/blog/831721 ClassLoader 提供了两个方法用于从装载的类路径中取得资源: public URL  getResource ( ...

  6. linux之eval

    1. eval command-line 其中command-line是在终端上键入的一条普通命令行.然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次.如: pipe=&qu ...

  7. 全景播放器-js+flash

    经过一个多月的辛苦,全景播放展示平台终于做出来了,主要用到的是js+flash技术.有什么不足的地方园子里的兄弟还请多多指教啊 <iframe  src="http://www.ipa ...

  8. AC日记——郁闷的出纳员 codevs 1286

    郁闷的出纳员 思路: 设工资下限为ko,然后ko--(因为要小于工资下限): 设cur为记录工资增长,降低: 设第i个人的工资为pos: 对应的四种操作: 插入:cur-pos-ko: 增长:cur- ...

  9. Chrome 75 将原生支持图片懒加载

    4 月 6 日,Google 的 Chrome & Web 平台工程经理 Addy Osmani 在个人博客发文,介绍到 <img> 和 <iframe> 的 load ...

  10. Codeforces 371A K-Periodic Array(模拟)

    题目链接 K-Periodic Array 简单题,直接模拟即可. #include <bits/stdc++.h> using namespace std; #define REP(i, ...