2017-01-09 18 views
0

SWXMLHashを使用して次のコードを使用しましたが、XMLパーサーは処理できないようです。私はそれがデータを返すことを確認するためにURLをチェックしていますSWXMLHashを使用してWebサービスから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 

私はURLから取得した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

xml ["Sensors"] 'は何かを返しますか? YESなら 'xml [" Sensors "] [" Sensor "]' too? yesの場合、 'xml [" Sensors "] [" Sensor "] [" Name "]'? – Larme

+0

xml変数には解析後にデータがありません。 – HillInHarwich

+0

これは、XMLの値を印刷しようとすると次のようになります。xml: 式の記述がエラーを出力しました:エラー:/var/folders/z0/gvxkyn_x3d18qbkml14_wngc0000/T/./lldb/42932/expr33.swift:1 :75:エラー: 'XMLIndexer'は 'SWXMLHash'のメンバータイプではありません。 Swift._DebuggerSupport.stringForPrintObject(Swift.UnsafePointer (bitPattern:0x1045a4290)!pointee) – HillInHarwich

答えて

0

OK。私は問題を解決しました。問題は、サーバーから受信したXMLファイルにありました。 UTF-8形式のようですが、UTF-16と書かれています。ですから、私は受け取ったデータオブジェクトをUTF-8 NSStringに変換し、それをStringにキャストします!以下のコードを参照してください:

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要素がありますが、1つだけSensors要素です。

ので、代わりに:返されたグループのうちの第一のセンサをつかむだろう

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

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

次のようなものを持っている必要があります。このことができます

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

希望:センサーをループする

は、あなたのようなものがあるでしょう!

+0

xcodeのグラブイメージをご覧くださいプロジェクトが実行されている地方自治体。 – HillInHarwich

関連する問題