2017-01-09 58 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