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

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

假设需要被解析的XML数据文件users.xml如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<? xml version = "1.0" encoding = "utf-8" ?> 
< Users
     < User id = "101" >
         < name >航歌</ name >
         < tel >
             < mobile >1234567</ mobile >
             < home >025-8100000</ home >
         </ tel
     </ User
     < User id = "102" >
         < name >hangge</ name >
         < tel >
             < mobile >8989889</ mobile >
             < home >025-8122222</ home >
         </ tel >
     </ User
</ Users >

我们需要实现的功能是解析并打印出需要的数据:

1
2
User: uid: 101 ,uname:航歌,mobile: 1234567 ,home: 025 - 8100000
User: uid: 102 ,uname:hangge,mobile: 8989889 ,home: 025 - 8122222


一,使用GDataXML(这个是google出品的) 

1,在build phases -> Link Binary With Libraries中,点击“+”添加“libxml2.2.dylib”
 

2,在build setting -> Header Search Paths里添加 ${SDK_DIR}/usr/include/libxml2
 

3,在build setting里的Objective-C编译选项里,把自动引用计数改为No,否则在应用GDataXML库时会编译有错
 

4,添加bridge.h头文件并设置到编译参数里
1
# import "GDataXMLNode.h"

5,导入GDataXML库文件(GDataXMLNode.h和GDataXMLNode.m),代码结构如下:

 

6,开始解析(ViewController.swift)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import UIKit
 
class ViewController : UIViewController {
                             
     override func viewDidLoad() {
         super .viewDidLoad()
         // Do any additional setup after loading the view, typically from a nib.
         var label: UILabel = UILabel (frame: CGRectMake (100, 100,300,100));
         label.text = "输出结果在控制台"
         self .view.addSubview(label)
         //测试Swift调用Object的XML库功能
         testXML()
     }
     
     override func didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
         // Dispose of any resources that can be recreated.
     }
 
     func testXML() {
         //获取xml文件路径
         var path = NSBundle .mainBundle().pathForResource( "users" , ofType: "xml" )
         //获取xml文件内容
         var xmlData = NSData (contentsOfFile:path!)
         //可以转换为字符串输出查看
         //println(NSString(data:xmlData, encoding:NSUTF8StringEncoding))
         
         //使用NSData对象初始化文档对象
         //这里的语法已经把OC的初始化函数直接转换过来了
         var doc: GDataXMLDocument = GDataXMLDocument (data:xmlData, options : 0, error : nil )
         
         //获取Users节点下的所有User节点,显式转换为element类型编译器就不会警告了
         //var users = doc.rootElement().elementsForName("User") as GDataXMLElement[]
         
         //通过XPath方式获取Users节点下的所有User节点,在路径复杂时特别方便
         var users = doc.nodesForXPath( "//User" , error: nil ) as [ GDataXMLElement ]
         
         for user in users {
             //User节点的id属性
             let uid = user.attributeForName( "id" ).stringValue()
             //获取name节点元素
             let nameElement = user.elementsForName( "name" )[0] as GDataXMLElement
             //获取元素的值
             let uname =  nameElement.stringValue()
             //获取tel子节点
             let telElement = user.elementsForName( "tel" )[0] as GDataXMLElement
             //获取tel节点下mobile和home节点
             let mobile = (telElement.elementsForName( "mobile" )[0] as GDataXMLElement ).stringValue()
             let home = (telElement.elementsForName( "home" )[0] as GDataXMLElement ).stringValue()
             //输出调试信息
             println ( "User: uid:\(uid),uname:\(uname),mobile:\(mobile),home:\(home)" )
         }      
     }
}

示例下载:GDataXML.zip

二,使用DDXML

1,2,3步同上
4,添加bridge.h头文件并设置到编译参数里
1
2
# import "DDXML.h"
# import "DDXMLElementAdditions.h"

5,导入DDXML库文件

6,开始解析(ViewController.swift)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import UIKit
 
class ViewController : UIViewController {
     
     override func viewDidLoad() {
         super .viewDidLoad()
         // Do any additional setup after loading the view, typically from a nib.
         var label: UILabel = UILabel (frame: CGRectMake (100, 100,300,100));
         label.text = "输出结果在控制台"
         self .view.addSubview(label)
         //测试Swift调用Object的XML库功能
         testXML()
     }
     
     override func didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
         // Dispose of any resources that can be recreated.
     }
     
     func testXML() {
         //获取xml文件路径
         var path = NSBundle .mainBundle().pathForResource( "users" , ofType: "xml" )
         //获取xml文件内容
         var xmlData = NSData (contentsOfFile:path!)
         
         //构造XML文档
         var doc = DDXMLDocument (data: xmlData, options:0, error: nil )
         
         //利用XPath来定位节点(XPath是XML语言中的定位语法,类似于数据库中的SQL功能)
         var users = doc.nodesForXPath( "//User" , error: nil ) as [ DDXMLElement ]
         for user in users {
             let uid = user.attributeForName( "id" ).stringValue()
             //DDXMLElementAdditions提供了elementForName获取单个节点,不用获取数组了
             let uname = user.elementForName( "name" ).stringValue()
             //获取tel节点的子节点
             let telElement = user.elementForName( "tel" ) as DDXMLElement
             let mobile = (telElement.elementForName( "mobile" ) as DDXMLElement ).stringValue()
             let home = (telElement.elementForName( "home" ) as DDXMLElement ).stringValue()
             println ( "User: uid:\(uid),uname:\(uname),mobile:\(mobile),home:\(home)" )
         }       
     }
}

示例下载:DDXML.zip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值