xml – 在Swift 4中实现自定义解码器
我想使用Swift 4中引入的新的Decodable协议解码XML文档,但是,似乎没有符合解码器协议的XML解码器的现有实现.
我的计划是使用SWXMLHash库来解析XML,然后可能使该库中的XMLIndexer类扩展Decoder协议,以便可以使用XMLIndexer实例初始化我的模型(SWXMLHash.parse(xmlString)返回XMLIndexer) . 我的问题是我不知道如何实现解码器协议,我似乎无法在网上找到任何解释它是如何完成的资源.我发现的每个资源都严格地提到了Swift标准库中包含的JSONDecoder类,我找不到任何资源来解决创建自己的自定义解码器的问题.
我还没有机会将我的代码转换为框架,但您可以查看我的Github存储库,它实现了自定义解码器和XML编码器.
链接:https://github.com/ShawnMoore/XMLParsing 编码器和解码器驻留在repo的XML文件夹中.它基于Apple的JSONEncoder和JSONDecoder,其更改符合XML标准. XMLDecoder和JSONDecoder之间的差异 > XMLDecoder.DateDecodingStrategy有一个名为keyFormatted的额外案例.这种情况采用一个闭包,为您提供CodingKey,由您提供所提供密钥的正确DateFormatter.这只是JSONDecoder的DateDecodingStrategy上的一个便利案例. XMLEncoder和JSONEncoder之间的差异 >包含一个名为StringEncodingStrategy的选项,这个枚举有两个选项,deferredToString和cdata. deferredToString选项是默认选项,将字符串编码为简单字符串.如果选择了cdata,则所有字符串都将编码为CData. 例子 有关示例的完整列表,请参阅存储库中的Sample XML文件夹. XML To Parse: <?xml version="1.0"?> <book id="bk101"> <author>Gambardella,Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth look at creating applications with XML.</description> </book> Swift结构: struct Book: Codable { var id: String var author: String var title: String var genre: Genre var price: Double var publishDate: Date var description: String enum CodingKeys: String,CodingKey { case id,author,title,genre,price,description case publishDate = "publish_date" } } enum Genre: String,Codable { case computer = "Computer" case fantasy = "Fantasy" case romance = "Romance" case horror = "Horror" case sciFi = "Science Fiction" } 的XMLDecoder: let data = Data(forResource: "book",withExtension: "xml") else { return nil } let decoder = XMLDecoder() let formatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" return formatter }() decoder.dateDecodingStrategy = .formatted(formatter) do { let book = try decoder.decode(Book.self,from: data) } catch { print(error) } XMLEncoder: let encoder = XMLEncoder() let formatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" return formatter }() encoder.dateEncodingStrategy = .formatted(formatter) do { let data = try encoder.encode(self,withRootKey: "book",header: XMLHeader(version: 1.0)) print(String(data: data,encoding: .utf8)) } catch { print(error) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |