iosswiftxmlxcodexmlmapper

Generate XML with Swift 5 to Alamofire


I need generate the following XML in swift 5 in order to post it with Alamofire. I tried doing this with XMLMapper but could not figure out how to handle this. Could anyone give some advice?

<SERVICE name="dataservice/transaction.getView">
    <PARAMETERS>
        <PARAMETER name='columnList'>PERSON.FIRSTNAME,PERSON.PREFIX,PERSON.NAME,ACCESSKEY.RCN,READER.NAME</PARAMETER>
        <PARAMETER name='filterTransTypeList'>1,2</PARAMETER>
        <PARAMETER name='fromDate'>2021-01-17 00:00:00</PARAMETER>
    </PARAMETERS>
</SERVICE>

best regards,

Patrick


Solution

  • Using XMLMapper, you can generate this XML.

    Try the following model:

    class Service: XMLMappable {
        var nodeName: String! = "SERVICE"
        
        var name: String?
        var parameters: [Parameter]?
        
        init(name: String?, parameters: [Parameter]?) {
            self.name = name
            self.parameters = parameters
        }
        
        required init?(map: XMLMap) {}
        
        func mapping(map: XMLMap) {
            name <- map.attributes["name"]
            parameters <- map["PARAMETERS.PARAMETER"]
        }
    }
    
    class Parameter: XMLMappable {
        var nodeName: String!
        
        var name: String?
        var value: String?
        
        init(name: String?, value: String?) {
            self.name = name
            self.value = value
        }
        
        required init?(map: XMLMap) {}
        
        func mapping(map: XMLMap) {
            name <- map.attributes["name"]
            value <- map.innerText
        }
    }
    

    Generate your XML like:

    let service = Service(
        name: "dataservice/transaction.getView",
        parameters: [
            Parameter(
                name: "columnList",
                value: "PERSON.FIRSTNAME,PERSON.PREFIX,PERSON.NAME,ACCESSKEY.RCN,READER.NAME"
            ),
            Parameter(
                name: "filterTransTypeList",
                value: "1,2"
            ),
            Parameter(
                name: "fromDate",
                value: "2021-01-17 00:00:00"
            ),
        ]
    )
    print(service.toXMLString() ?? "nil")
    

    or send it with Alamofire (using Requests subspec):

    AF.request("<URL>", method: .post, parameters: service.toXML(), encoding: XMLEncoding.default)