如下有个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的其他回调方法
网友评论