美文网首页
swift xml解析

swift xml解析

作者: 本帅不良 | 来源:发表于2018-12-11 14:38 被阅读25次

如下有个XML文件

<?xml version="1.0" encoding="utf-8"?>
<PopoEmoticons>
    <Catalog Title="default">
        <Emoticon File="emoji_01.png" ID="emoticon_emoji_00" Tag="[微笑]"/>
        <Emoticon File="emoji_00.png" ID="emoticon_emoji_01" Tag="[撇嘴]"/>
        <Emoticon File="emoji_02.png" ID="emoticon_emoji_02" Tag="[色]"/>
        <Emoticon File="emoji_03.png" ID="emoticon_emoji_03" Tag="[发呆]"/>
        <Emoticon File="emoji_04.png" ID="emoticon_emoji_04" Tag="[得意]"/>
        <Emoticon File="emoji_05.png" ID="emoticon_emoji_05" Tag="[流泪]"/>
        <Emoticon File="emoji_06.png" ID="emoticon_emoji_06" Tag="[害羞]"/>
        <Emoticon File="emoji_07.png" ID="emoticon_emoji_07" Tag="[闭嘴]"/>
        <Emoticon File="emoji_08.png" ID="emoticon_emoji_08" Tag="[睡]"/>
        <Emoticon File="emoji_09.png" ID="emoticon_emoji_09" Tag="[大哭]"/>
        <Emoticon File="emoji_10.png" ID="emoticon_emoji_10" Tag="[尴尬]"/>
        <Emoticon File="emoji_11.png" ID="emoticon_emoji_11" Tag="[发怒]"/>
        <Emoticon File="emoji_12.png" ID="emoticon_emoji_12" Tag="[调皮]"/>
        <Emoticon File="emoji_13.png" ID="emoticon_emoji_13" Tag="[呲牙]"/>
        <Emoticon File="emoji_14.png" ID="emoticon_emoji_14" Tag="[惊讶]"/>
        <Emoticon File="emoji_15.png" ID="emoticon_emoji_15" Tag="[难过]"/>
        <Emoticon File="emoji_16.png" ID="emoticon_emoji_16" Tag="[酷]"/>
        <Emoticon File="emoji_17.png" ID="emoticon_emoji_17" Tag="[冷汗]"/>
        <Emoticon File="emoji_18.png" ID="emoticon_emoji_18" Tag="[抓狂]"/>
        <Emoticon File="emoji_19.png" ID="emoticon_emoji_19" Tag="[吐]"/>
        <Emoticon File="emoji_20.png" ID="emoticon_emoji_20" Tag="[偷笑]"/>
        <Emoticon File="emoji_21.png" ID="emoticon_emoji_21" Tag="[愉快]"/>
        <Emoticon File="emoji_22.png" ID="emoticon_emoji_22" Tag="[白眼]"/>
        <Emoticon File="emoji_23.png" ID="emoticon_emoji_23" Tag="[傲慢]"/>
        <Emoticon File="emoji_24.png" ID="emoticon_emoji_24" Tag="[饥饿]"/>
        <Emoticon File="emoji_25.png" ID="emoticon_emoji_25" Tag="[困]"/>
        <Emoticon File="emoji_26.png" ID="emoticon_emoji_26" Tag="[惊恐]"/>
        <Emoticon File="emoji_27.png" ID="emoticon_emoji_27" Tag="[流汗]"/>
        <Emoticon File="emoji_28.png" ID="emoticon_emoji_28" Tag="[憨笑]"/>
        <Emoticon File="emoji_29.png" ID="emoticon_emoji_29" Tag="[悠闲]"/>
        <Emoticon File="emoji_30.png" ID="emoticon_emoji_30" Tag="[奋斗]"/>
        <Emoticon File="emoji_31.png" ID="emoticon_emoji_31" Tag="[咒骂]"/>
        <Emoticon File="emoji_32.png" ID="emoticon_emoji_32" Tag="[疑问]"/>
        <Emoticon File="emoji_33.png" ID="emoticon_emoji_33" Tag="[嘘]"/>
        <Emoticon File="emoji_34.png" ID="emoticon_emoji_34" Tag="[晕]"/>
        <Emoticon File="emoji_35.png" ID="emoticon_emoji_35" Tag="[疯了]"/>
        <Emoticon File="emoji_36.png" ID="emoticon_emoji_36" Tag="[衰]"/>
        <Emoticon File="emoji_37.png" ID="emoticon_emoji_37" Tag="[骷髅]"/>
        <Emoticon File="emoji_38.png" ID="emoticon_emoji_38" Tag="[敲打]"/>
        <Emoticon File="emoji_39.png" ID="emoticon_emoji_39" Tag="[再见]"/>
        <Emoticon File="emoji_40.png" ID="emoticon_emoji_40" Tag="[擦汗]"/>
        <Emoticon File="emoji_41.png" ID="emoticon_emoji_41" Tag="[抠鼻]"/>
        <Emoticon File="emoji_42.png" ID="emoticon_emoji_42" Tag="[鼓掌]"/>
        <Emoticon File="emoji_43.png" ID="emoticon_emoji_43" Tag="[糗大了]"/>
        <Emoticon File="emoji_44.png" ID="emoticon_emoji_44" Tag="[坏笑]"/>
        <Emoticon File="emoji_45.png" ID="emoticon_emoji_45" Tag="[左哼哼]"/>
        <Emoticon File="emoji_46.png" ID="emoticon_emoji_46" Tag="[右哼哼]"/>
        <Emoticon File="emoji_47.png" ID="emoticon_emoji_47" Tag="[哈欠]"/>
        <Emoticon File="emoji_48.png" ID="emoticon_emoji_48" Tag="[鄙视]"/>
        <Emoticon File="emoji_49.png" ID="emoticon_emoji_49" Tag="[委屈]"/>
        <Emoticon File="emoji_50.png" ID="emoticon_emoji_50" Tag="[快哭]"/>
        <Emoticon File="emoji_51.png" ID="emoticon_emoji_51" Tag="[阴险]"/>
        <Emoticon File="emoji_52.png" ID="emoticon_emoji_52" Tag="[亲亲]"/>
        <Emoticon File="emoji_53.png" ID="emoticon_emoji_53" Tag="[吓]"/>
        <Emoticon File="emoji_54.png" ID="emoticon_emoji_54" Tag="[可怜]"/>
        <Emoticon File="emoji_55.png" ID="emoticon_emoji_55" Tag="[菜刀]"/>
        <Emoticon File="emoji_56.png" ID="emoticon_emoji_56" Tag="[西瓜]"/>
        <Emoticon File="emoji_57.png" ID="emoticon_emoji_57" Tag="[啤酒]"/>
        <Emoticon File="emoji_58.png" ID="emoticon_emoji_58" Tag="[篮球]"/>
        <Emoticon File="emoji_59.png" ID="emoticon_emoji_59" Tag="[乒乓]"/>
        <Emoticon File="emoji_60.png" ID="emoticon_emoji_60" Tag="[咖啡]"/>
        <Emoticon File="emoji_61.png" ID="emoticon_emoji_61" Tag="[饭]"/>
        <Emoticon File="emoji_62.png" ID="emoticon_emoji_62" Tag="[猪头]"/>
        <Emoticon File="emoji_63.png" ID="emoticon_emoji_63" Tag="[玫瑰]"/>
        <Emoticon File="emoji_64.png" ID="emoticon_emoji_64" Tag="[凋谢]"/>
        <Emoticon File="emoji_65.png" ID="emoticon_emoji_65" Tag="[嘴唇]"/>
        <Emoticon File="emoji_66.png" ID="emoticon_emoji_66" Tag="[爱心]"/>
        <Emoticon File="emoji_67.png" ID="emoticon_emoji_67" Tag="[心碎]"/>
        <Emoticon File="emoji_68.png" ID="emoticon_emoji_68" Tag="[蛋糕]"/>
        <Emoticon File="emoji_69.png" ID="emoticon_emoji_69" Tag="[闪电]"/>
        <Emoticon File="emoji_70.png" ID="emoticon_emoji_70" Tag="[炸弹]"/>
        <Emoticon File="emoji_71.png" ID="emoticon_emoji_71" Tag="[刀]"/>
        <Emoticon File="emoji_72.png" ID="emoticon_emoji_72" Tag="[足球]"/>
        <Emoticon File="emoji_73.png" ID="emoticon_emoji_73" Tag="[瓢虫]"/>
        <Emoticon File="emoji_74.png" ID="emoticon_emoji_74" Tag="[便便]"/>
        <Emoticon File="emoji_75.png" ID="emoticon_emoji_75" Tag="[月亮]"/>
        <Emoticon File="emoji_76.png" ID="emoticon_emoji_76" Tag="[太阳]"/>
        <Emoticon File="emoji_77.png" ID="emoticon_emoji_77" Tag="[礼物]"/>
        <Emoticon File="emoji_78.png" ID="emoticon_emoji_78" Tag="[拥抱]"/>
        <Emoticon File="emoji_79.png" ID="emoticon_emoji_79" Tag="[强]"/>
        <Emoticon File="emoji_80.png" ID="emoticon_emoji_80" Tag="[弱]"/>
        <Emoticon File="emoji_81.png" ID="emoticon_emoji_81" Tag="[握手]"/>
        <Emoticon File="emoji_82.png" ID="emoticon_emoji_82" Tag="[胜利]"/>
        <Emoticon File="emoji_83.png" ID="emoticon_emoji_83" Tag="[抱拳]"/>
        <Emoticon File="emoji_84.png" ID="emoticon_emoji_84" Tag="[勾引]"/>
        <Emoticon File="emoji_85.png" ID="emoticon_emoji_85" Tag="[拳头]"/>
        <Emoticon File="emoji_86.png" ID="emoticon_emoji_86" Tag="[差劲]"/>
        <Emoticon File="emoji_87.png" ID="emoticon_emoji_87" Tag="[爱你]"/>
        <Emoticon File="emoji_88.png" ID="emoticon_emoji_88" Tag="[NO]"/>
        <Emoticon File="emoji_89.png" ID="emoticon_emoji_89" Tag="[OK]"/>
        <Emoticon File="emoji_90.png" ID="emoticon_emoji_90" Tag="[爱情]"/>
        <Emoticon File="emoji_91.png" ID="emoticon_emoji_91" Tag="[飞吻]"/>
        <Emoticon File="emoji_92.png" ID="emoticon_emoji_92" Tag="[跳跳]"/>
        <Emoticon File="emoji_93.png" ID="emoticon_emoji_93" Tag="[发抖]"/>
        <Emoticon File="emoji_94.png" ID="emoticon_emoji_94" Tag="[怄火]"/>
        <Emoticon File="emoji_95.png" ID="emoticon_emoji_95" Tag="[转圈]"/>
        <Emoticon File="emoji_96.png" ID="emoticon_emoji_96" Tag="[磕头]"/>
        <Emoticon File="emoji_97.png" ID="emoticon_emoji_97" Tag="[回头]"/>
        <Emoticon File="emoji_98.png" ID="emoticon_emoji_98" Tag="[跳绳]"/>
        <Emoticon File="emoji_99.png" ID="emoticon_emoji_99" Tag="[投降]"/>
        <Emoticon File="emoji_100.png" ID="emoticon_emoji_100" Tag="[激动]"/>
        <Emoticon File="emoji_101.png" ID="emoticon_emoji_101" Tag="[乱舞]"/>
        <Emoticon File="emoji_102.png" ID="emoticon_emoji_102" Tag="[献吻]"/>
        <Emoticon File="emoji_103.png" ID="emoticon_emoji_103" Tag="[左太极]"/>
        <Emoticon File="emoji_104.png" ID="emoticon_emoji_104" Tag="[右太极]"/>
    </Catalog>
</PopoEmoticons>

构建数据模型

import UIKit

class EmoticonModel: NSObject {
//    <Emoticon File="emoji_02.png" ID="emoticon_emoji_02" Tag="[色]"/>
    var File: String = ""
    var ID: String = ""
    var Tag: String = ""
    convenience init(File:String?,ID:String?,Tag:String?) {
        self.init()
        self.File = File ?? ""
        self.ID = ID ?? ""
        self.Tag = Tag ?? ""
    }
}

创建一个工具类用于解析XML

import UIKit
//    <Emoticon File="emoji_02.png" ID="emoticon_emoji_02" Tag="[色]"/>
//声明 XMLParserDelegate
class EmojiXMLAnalysis: NSObject, XMLParserDelegate {
    //单例
    private static let _shareInstance = EmojiXMLAnalysis()
    class func share() -> EmojiXMLAnalysis {
        return _shareInstance
    }
    //用于接收解析到的EmoticonModel对象
    var emjArray : [EmoticonModel] = []
    
    /// 获取解析到的XML数据
    ///
    /// - Returns: 包含EmoticonModel对象的数组
    func getEmojiArr() -> [EmoticonModel] {
        //guard内部进行了获取XML文件路径的操作,需根据您的XML路径进行修改
        //如果emjArray内元素个数不等于0,说明已经进行过XML解析、emjArray内有我们需要的值,则直接返回emjArray,否则继续
        guard
            emjArray.count == 0,
            let bundlePath = Bundle.main.path(forResource: "IMEmoji", ofType: "bundle"),
            let bundle = Bundle.init(path: bundlePath),
            let path = bundle.path(forResource: "emoji", ofType: "xml")
        else {
            return emjArray
        }
        //此处传入XML文件路径,用于XML解析,解析的过程在XMLParserDelegate回调中处理
        let parser = XMLParser.init(contentsOf: URL.init(fileURLWithPath: path))
        parser?.delegate = self
        parser?.parse()
        return emjArray
    }
    
    //MARK:XMLParserDelegate的代理方法
    //解析到起始标签
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {

        if elementName == "Emoticon" {
            let emoji = EmoticonModel.init(File: attributeDict["File"], ID: attributeDict["ID"], Tag: attributeDict["Tag"])
            self.emjArray.append(emoji)
        }
    }
}

如何使用?

let arr = EmojiXMLAnalysis.share().getEmojiArr()

总结

使用XMLParser及其代理XMLParserDelegate进行XML解析,几个关键点在于:
1、初始化传入地址、建立代理关系、调用parse()方法开始解析
2、声明XMLParserDelegate
3、在XMLParserDelegate的回调中处理数据,由于示例的结果比较简单,我们只需要在遇到“Emoticon”标签时,读取“Emoticon”标签的属性,赋值给EmoticonModel模型对象即可。如有更复杂的操作可能需要用到XMLParserDelegate的其他回调方法

相关文章

  • swift xml解析

    如下有个XML文件 构建数据模型 创建一个工具类用于解析XML 如何使用? 总结 使用XMLParser及其代理X...

  • Swift实现xml解析

    这里介绍基本的xml数据解析并打印出来. 1.准备xml数据 打开记事本,写下: 保存命名为data.xml. 2...

  • swift 实现xml解析

    1 准备xml数据 代码: //----------------------------------------...

  • iOS解析XML

    2.0 XML解析 2.1 XML简单介绍 (1) XML:可扩展标记语言 (2) XML解析 2.2 XML解析...

  • iOS开发-XML解析

    一、 XML解析 1.1 XML简单介绍 (1) XML:可扩展标记语言 (2) XML解析 1.2 XML解析 ...

  • 3-XML解析

    3.0 XML解析 3.1 XML简单介绍 (1) XML:可扩展标记语言 (2) XML解析 3.2 XML解析...

  • XML、JSON解析

    XML解析 XML_GData解析 JSON解析

  • 05、网络解析

    解析:从事先规定好的格式中提取数据iOS开发常见的解析:XML解析,JSON解析 XML解析 XMl事例: XML...

  • Senior进阶 网络之数据解析之XML解析和JSON解析的用法

    Senior进阶 网络之数据解析之XML解析和JSON解析的用法 XML解析之SAX解析 XML解析之DOM解析 ...

  • XML

    NSXMLParser解析XML GDataXML解析XML

网友评论

      本文标题:swift xml解析

      本文链接:https://www.haomeiwen.com/subject/dqoshqtx.html