【问题标题】:Xml parsing to dictionary in swift快速将 Xml 解析为字典
【发布时间】:2020-04-30 05:01:30
【问题描述】:

我想将 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 来获取响应。

我想在屏幕上显示余额,但是当我进入 xml 时:

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

我收到一个错误提示

XML 元素错误:不正确的键 ["ResponseXml"]

但我可以在响应中看到该键。如果我一直到["ProcessResult"] 它工作正常,在["ProcessResult"] 键之后获取数据。

【问题讨论】:

  • 我复制/粘贴你的 XML,并让它与SWXMLHash一起工作
  • 你没有收到那个错误信息吗

标签: arrays swift dictionary xml-parsing


【解决方案1】:

我终于猜对了,代码现在没有优化多少,但现在可以正常工作了。我在下面添加了代码。如果它帮助别人。

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()


}
}

【讨论】:

  • 对于未来的读者,您究竟做了哪些更改以使其正常工作?
猜你喜欢
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
相关资源
最近更新 更多