• iOS开发之解析XML格式数据


         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  。欢迎大家訪问!


  • 相关阅读:
    自己动手搭建私有百度网盘
    JVM 基础、堆内存分析和垃圾回收算法
    基于 Solo 通过阿里云服务器+Docker+Nginx+MySQL搭建个人博客
    ES6新特性总结
    JavaIO流总结
    Linq查找最大值max最小值min效率比较
    c# 控制台console进度条
    在 dotnet core (C#)下的颜色渐变
    go笔记--几个例子理解context的作用
    go微服务框架kratos学习笔记六(kratos 服务发现 discovery)
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7241761.html
Copyright © 2020-2023  润新知