zoukankan      html  css  js  c++  java
  • Swift

    在做一些应用的时候经常需要用到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

  • 相关阅读:
    python 基础2.5 循环中continue与breake用法
    python 基础 2.4 while 循环
    python 基础 2.3 for 循环
    python 基础 2.2 if流程控制(二)
    python 基础 2.1 if 流程控制(一)
    python 基础 1.6 python 帮助信息及数据类型间相互转换
    python 基础 1.5 python数据类型(四)--字典常用方法示例
    Tornado Web 框架
    LinkCode 第k个排列
    LeetCode 46. Permutations
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4838369.html
Copyright © 2011-2022 走看看