答案 0 :(得分:1)
由于您不介意使用第三方库,因此可以尝试XMLMapper(类似于ObjectMapper,但适用于XML)
使用以下模型类:
class GNCv2: XMLMappable {
var nodeName: String!
var gncAccounts: [GNCAccount]?
required init?(map: XMLMap) {}
func mapping(map: XMLMap) {
gncAccounts <- map["gnc:book.gnc:account"]
}
}
class GNCAccount: XMLMappable {
var nodeName: String!
var name: String?
var id: AccountID?
var type: String?
var commoditySpace: String?
var commodityID: String?
var commoditySCU: Int?
var description: String?
var slots: AccountSlot?
var parent: AccountID?
required init(map: XMLMap) {}
func mapping(map: XMLMap) {
name <- map["act:name"]
id <- map["act:id"]
type <- map["act:type"]
commoditySpace <- map["act:commodity.cmdty:space"]
commodityID <- map["act:commodity.cmdty:id"]
commoditySCU <- map["act:commodity-scu"]
description <- map["act:description"]
slots <- map["act:slots.slot"]
parent <- map["act:parent"]
}
}
class AccountID: XMLMappable {
var nodeName: String!
var type: String?
var value: String?
required init(map: XMLMap) {}
func mapping(map: XMLMap) {
type <- map.attributes["type"]
value <- map.innerText
}
}
class AccountSlot: XMLMappable {
var nodeName: String!
var key: String?
var value: AccountSlotValue?
required init(map: XMLMap) {}
func mapping(map: XMLMap) {
key <- map["slot:key"]
value <- map["slot:value"]
}
}
class AccountSlotValue: XMLMappable {
var nodeName: String!
var type: String?
var value: Bool?
required init(map: XMLMap) {}
func mapping(map: XMLMap) {
type <- map.attributes["type"]
value <- map.innerText
}
}
然后使用根对象类的init(XMLString:)
函数(在本例中为GNCv2
)映射XML,如下所示:
let gncv2 = GNCv2(XMLString: xmlString)
您可以通过使用map(XMLString:)
的{{1}}函数来实现完全一样的事情:
XMLMapper
希望这会有所帮助。