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

  • 相关阅读:
    [置顶] 十年博客行
    计算机编程语言年史
    初步认知MySQL metadata lock(MDL)
    Oracle语句优化规则(二)
    正则表达式
    sql server中的 SET NOCOUNT ON 的含义
    SQO (标准查询运算符)方法 & Linq To Object
    C# 扩展
    特性
    C#之泛型
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4838369.html
Copyright © 2011-2022 走看看