【发布时间】:2018-05-20 22:47:29
【问题描述】:
使用 Swift4、iOS11.1、Xcode9.1,
使用新的 Swift4 类型别名“Codable”非常适合 JSON 解码(如 here 或 here 或许多其他贡献中所述)。然而,在 XML 解析方面,我找不到任何关于这种“可编码”协议是否也可以用于 XML 解码的信息。
我尝试使用 XMLParser(可以在下面的 code-excerts 中看到)。但是我没有使用“可编码”协议来简化 XML 解析过程。我该如何使用 Codable-protocol 来简化 XML 解析??
// the Fetching of the XML-data (excert shown here with a simple dataTask) :
let myTask = session.dataTask(with: myRequest) { (data, response, error) in
// check for error
guard error == nil else {
completionHandler(nil, error!)
return
}
// make sure we got data in the response
guard let responseData = data else {
let error = XMLFetchError.objectSerialization(reason: "No data in response")
completionHandler(nil, error)
return
}
// the responseData is XML !!!!!!!!!!!!!!
let parser = XMLParser(data: responseData)
parser.delegate = self
parser.parse()
}
myTask.resume()
对应的XMLParserDelegate-methods:
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
self.resultTrip = elementName
// print(elementName)
if (self.resultTrip == "TripResult") {
self.resultTime = ""
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
let data = string.trimmingCharacters(in: .whitespacesAndNewlines)
if data.count != 0 {
switch self.resultTrip {
case "TimetabledTime": self.resultTime = data
default: break
}
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if self.resultTrip == "TripResult" {
// HERE IS THE MISSING BIT: HOW DO YOU USE A CODABLE struct ???
var myTrip = TripResult(from: <#Decoder#>)
myTrip.resultID = self.resultTrip
}
print(resultTime)
}
结构:
struct TripResult : Codable {
let resultId : String?
let trip : Trip?
enum CodingKeys: String, CodingKey {
case resultId = "ResultId"
case trip
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
resultId = try values.decodeIfPresent(String.self, forKey: .resultId)
trip = try Trip(from: decoder)
}
}
我将如何使用“可编码”结构?有没有关于如何使用 Codable 协议进行 XML 解析的好例子? 任何帮助表示赞赏!
【问题讨论】:
-
Foundation中没有XMLEncoder或XMLDecoder,就像 JSON 一样。Codable在涉及 XML 时毫无用处。 -
有
PropertyListEncoder和PropertyListDecoder可以设置格式为.xml
标签: xml-parsing decode swift4 codable