Xml парсинг к словарю в swift - PullRequest
0 голосов
/ 30 апреля 2020

Я хочу преобразовать XML ответ в словарь Я вставил свой XML ответ ниже

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <ProcessResponse xmlns="http://tempuri.org/">
       <ProcessResult>
        <ResponseXml>
           <StatusCode>0</StatusCode>
           <StatusDescription />
           <Balance>65.8250</Balance>
           <CreditStatus>Y</CreditStatus>
           <MerchantId>NEW</MerchantId>
           <Company>NEW</Company>
           <CompanyCity>CITY</CompanyCity>
           <CompanyPhone>123</CompanyPhone>
           <CompanyDbaName>NEW</CompanyDbaName>
           <BalanceChanged>0</BalanceChanged>
           <TransDate>2020-02-30</TransDate>
           <TransTime>00:50:29</TransTime>
           <ProductVer>2090655</ProductVer>
           <PromoVer />
           <SoftVer />
           <InvoiceNumber />
           <NSM>Entre em contato     conosco atraves do   numero 0800-152-0252</NSM>
        </ResponseXml>
     </ProcessResult>
  </ProcessResponse>

Я использую SWXMLHash для получения ответа.

Я хочу отобразить баланс на экране, но когда я go в xml вроде:

["s:Envelope"]["s:Body"]["ProcessResponse"]["ProcessResult"]["ResponseXml"]

я получаю сообщение об ошибке

XML Ошибка элемента: Неверный ключ ["Response Xml"]

, но я вижу этот ключ в ответе. если я беру до ["ProcessResult"], он работает нормально, получая данные после клавиши ["ProcessResult"].

1 Ответ

0 голосов
/ 30 апреля 2020

наконец-то я все понял, код теперь не сильно оптимизирован, но теперь он будет работать нормально. Я добавил код ниже. если это помогает другим.

import Foundation
import SWXMLHash
class ApiMapper: NSObject
{

func callPostAPI(apiname:String, parameter:String, completionBlockSuccess successBlock: @escaping ((XMLIndexer) -> Void), andFailureBlock failBlock: @escaping ((AnyObject) -> Void))
{
     var lobj_Request = URLRequest(url: URL(string: apiname)!)
     let session = URLSession.shared
     var _: NSError?

     lobj_Request.httpMethod = "POST"
     lobj_Request.httpBody = parameter.data(using: .utf8)
     lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
     lobj_Request.addValue("\(parameter.count)", forHTTPHeaderField: "Content-Length")

    let task = session.dataTask(with: lobj_Request, completionHandler: {data, response, error -> Void in

        let strData = String(data: data!, encoding: .utf8)


        if error != nil
        {
            print("Error: " + error!.localizedDescription)
        }
               let xml = SWXMLHash.parse(strData!)
        let xmlString = """
        \(xml["s:Envelope"]["s:Body"]["ProcessResponse"]["ProcessResult"])
        """
        print(xmlString)
        let xmlConverted = SWXMLHash.parse(xmlString)
        let convertedString = """
        \(xmlConverted["ProcessResult"]["ResponseXml"])
        """
         let responseXml = SWXMLHash.parse(convertedString)


                if let data = response {
                    print(data)

                    if let xmll = response{
                        print("JSON: \(xmll)")
                       // print(responseXml)
                        DispatchQueue.global(qos: .background).async {
                            DispatchQueue.main.async {
                                successBlock(responseXml as XMLIndexer)
                            }
                        }

                    }
                    else
                    {
                        let dic = ["message":"Something went wrong, Please try again"]

                        DispatchQueue.global(qos: .background).async {
                            DispatchQueue.main.async {
                                failBlock(dic as AnyObject)
                            }
                        }

                    }
                }

                else
                {
                    let dic = ["message":"Something went wrong, Please try again"]

                    DispatchQueue.global(qos: .background).async {
                        DispatchQueue.main.async {
                            failBlock(dic as AnyObject)
                        }
                    }

                }

        })
    task.resume()


}
}
...