如何在Swift中解析附加的XML并从中获取所有帐户信息

时间:2019-03-23 18:52:33

标签: swift xml

我是Swift的新手,发现很难用Swift语言解析链接的XML。我曾尝试使用SWXMLHash Pod库,但是它没有帮助我。我想从XML中提取帐户节点信息,并将其存储在结构中。

XML

1 个答案:

答案 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

希望这会有所帮助。