Swift String编码和NSXMLParser解析问题

时间:2014-12-30 15:10:12

标签: string swift encoding nsxmlparser

我的应用程序正在调用此URL中的免费天气预报网络服务: http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=Boston&CountryName=United+States

我使用通常的NSURLConnectionNSXMLParser委托方法来解析传入的数据(之前我已经完成了一百万次),但很奇怪,{{1返回的内容未通过NSMutableData正确转换为字符串。它基本上无法转换"<"和">"打开和关闭XML标签的字符,给我"& l t;"和"& g t;"代替。

问题似乎出现在NSUTF8StringEncoding函数中:

connectionDidFinishLoading

我从func connection(connection: NSURLConnection, didReceiveData data: NSData) { webServiceData!.appendData(data) } func connectionDidFinishLoading(connection: NSURLConnection) { let XMLResponseString = NSString(data: webServiceData!, encoding: NSUTF8StringEncoding)! println("XMLResponseString = \(XMLResponseString)") } 语句获得的输出是:

println

因此,您可以看到我正确获得前2个标签 - "< ?XML>"和"< string xmlns>"标签,但其余的都显示为"& l t;"和"& g t;"

真正奇怪的是它对第一个标签说<?xml version="1.0" encoding="utf-8"?> <string xmlns="http://www.webserviceX.NET">&lt;?xml version="1.0" encoding="utf-16"?&gt; &lt;CurrentWeather&gt; &lt;Location&gt;DALLAS EXECUTIVE AIRPORT, TX, United States (KRBD) 32-41N 096-52W 203M&lt;/Location&gt; &lt;Time&gt;Dec 30, 2014 - 08:53 AM EST / 2014.12.30 1353 UTC&lt;/Time&gt; &lt;Wind&gt; from the NE (050 degrees) at 12 MPH (10 KT):0&lt;/Wind&gt; &lt;Visibility&gt; 9 mile(s):0&lt;/Visibility&gt; &lt;SkyConditions&gt; overcast&lt;/SkyConditions&gt; &lt;Temperature&gt; 39.9 F (4.4 C)&lt;/Temperature&gt; &lt;DewPoint&gt; 34.0 F (1.1 C)&lt;/DewPoint&gt; &lt;RelativeHumidity&gt; 79%&lt;/RelativeHumidity&gt; &lt;Pressure&gt; 30.42 in. Hg (1030 hPa)&lt;/Pressure&gt; &lt;Status&gt;Success&lt;/Status&gt; &lt;/CurrentWeather&gt;</string> ,但在第二行(到最后)说encoding="utf-8"

所以我尝试使用encoding="utf-16"

NSUTF16StringEncoding

这基本上给了我中国人的角色。

我还尝试直接在url上运行解析器而不是返回的NSMutableData,如下所示:

let XMLResponseString = NSString(data: webServiceData!, encoding: NSUTF16StringEncoding)!

(最初的陈述是:

    myXMLParser = NSXMLParser(contentsOfURL:theURL!)!

但这些都没有奏效。

那么这里发生了什么?有关如何使其正常工作的任何建议吗?

1 个答案:

答案 0 :(得分:1)

这实际上是远程服务被破坏,而不是你的代码。是的,服务器真的是用XML发送XML,这是没有特别好的理由。

$ curl 'http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=Boston&CountryName=United+States'

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://www.webserviceX.NET">&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;CurrentWeather&gt;
  &lt;Location&gt;BOSTON LOGAN INTERNATIONAL, MA, United States (KBOS) 42-22N 071-01W 54M&lt;/Location&gt;