2017-01-09 55 views
0

我使用SWXMLHash具有以下代碼 - 但XML解析器似乎無法處理它。我已經檢查了URL,以確保它返回的數據:無法使用SWXMLHash從Webservice解析XML

let baseUrl = "http://apps.hha.co.uk/mis/Api/getlivesensors.aspx?key=6fb21537-fb4e-4fe4-b07a-d8d68567c9d1" 
     var request = URLRequest(url: NSURL(string: baseUrl)! as URL) 
     let session = URLSession.shared 
     request.httpMethod = "GET" 

     //var err: NSError? 

     let task = session.dataTask(with: request as URLRequest) { 
      (data, response, error) in 

      if data == nil { 
       print("dataTaskWithRequest error: \(error)") 
       return 
      } 

      let xml = SWXMLHash.parse(data!) 

      if (xml["Sensors"]["Sensor"]["Name"].element?.text) != nil 
      //if (xml["Sensors"]["Sensor"]["Name"].element?.text) != nil 
      { 
       self.sensors.add(xml["Sensors"]["Sensor"]["Name"].element?.text as Any) 
      } 

      DispatchQueue.main.async(execute : { 
       print(self.sensors) 
      }) 

     } 
     task.resume() 
     // but obviously don't try to use it here here 

我從網址,以獲取XML是這樣的(標記關閉了 - 我只是還沒有包括它們):

<Sensors> 
<Sensor> 
<ID>12</ID> 
<Name>EFM W.level</Name> 
<Series>Level</Series> 
<Unit>m</Unit> 
<Values> 
<Value CreatedOn="2017-01-08T13:50:00" Value="0.69"/> 
<Value CreatedOn="2017-01-08T14:00:00" Value="0.72"/> 
<Value CreatedOn="2017-01-08T14:10:00" Value="0.77"/> 
<Value CreatedOn="2017-01-08T14:20:00" Value="0.82"/> 
<Value CreatedOn="2017-01-08T14:30:00" Value="0.87"/> 

A view of the local variables as the app runs

+0

piece by piece:'xml [「Sensors」]'returns something?如果是,那麼'xml [「Sensors」] [「Sensor」]?如果是,'xml [「Sensors」] [「Sensor」] [「Name」]'? etc. – Larme

+0

解析後,xml變量沒有任何數據。 – HillInHarwich

+0

這是我在嘗試打印XML值時得到的結果:打印xml描述: 表達式生成錯誤:error:/var/folders/z0/gvxkyn_x3d18qbkml14_wngc0000gn/T/./lldb/42932/expr33.swift:1 :75:error:'XMLIndexer'不是'SWXMLHash'的成員類型 Swift._DebuggerSupport.stringForPrintObject(Swift.UnsafePointer (bitPattern:0x1045a4290)!. pointee) – HillInHarwich

回答

0

好的。我已經解決了這個問題。問題出在我從服務器收到的XML文件。它看起來像是UTF-8格式,但文檔說它是UTF-16。所以,我現在將接收到的數據對象轉換爲UTF-8 NSString,然後將其轉換爲字符串!請參閱下面的代碼:

let baseUrl = "http://apps.hha.co.uk/mis/Api/getlivesensors.aspx?key=6fb21537-fb4e-4fe4-b07a-d8d68567c9d1" 
    var request = URLRequest(url: NSURL(string: baseUrl)! as URL) 
    let session = URLSession.shared 
    request.httpMethod = "GET" 

    let task = session.dataTask(with: request as URLRequest) { 
     (data, response, error) in 

     if data == nil { 
      print("dataTaskWithRequest error: \(error)") 
      return 
     } 

     let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)?.replacingOccurrences(of: "utf-16", with: "utf-8") 

     let xml = SWXMLHash.parse(dataString! as String) 
     //let xml = SWXMLHash.parse(dataString!) 

     if (xml["Sensors"]["Sensor"][0]["Name"].element?.text) != nil 
     { 
      self.sensors.add(xml["Sensors"]["Sensor"][0]["Name"].element?.text as Any) 
     } 

     DispatchQueue.main.async(execute : { 
      print(self.sensors) 
     }) 

    } 
    task.resume() 
    // but obviously don't try to use it here here 
+0

感謝您的更新 - 如果其他人遇到UTF-8與UTF-16的問題,這是很好的信息。 –

1

有多個Sensor元素,但只有一個Sensors元素。

因此,而不是:

xml["Sensors"]["Sensor"]["Name"].element?.text 

你應該是這樣的:

xml["Sensors"]["Sensor"][0]["Name"].element?.text 

這將搶到第一傳感器出返回的組。

要遍歷所有的傳感器,你必須是這樣的:

for sensor in xml["Sensors"]["Sensor"].all { 
    sessors.add(sensor["Name"].element?.text) 
} 

希望這有助於!

+0

請參閱xcode當地人作爲項目運行。 – HillInHarwich