我的应用程序正在调用此URL中的免费天气预报网络服务: http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=Boston&CountryName=United+States
我使用通常的NSURLConnection
和NSXMLParser
委托方法来解析传入的数据(之前我已经完成了一百万次),但很奇怪,{{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"><?xml version="1.0" encoding="utf-16"?>
<CurrentWeather>
<Location>DALLAS EXECUTIVE AIRPORT, TX, United States (KRBD) 32-41N 096-52W 203M</Location>
<Time>Dec 30, 2014 - 08:53 AM EST / 2014.12.30 1353 UTC</Time>
<Wind> from the NE (050 degrees) at 12 MPH (10 KT):0</Wind>
<Visibility> 9 mile(s):0</Visibility>
<SkyConditions> overcast</SkyConditions>
<Temperature> 39.9 F (4.4 C)</Temperature>
<DewPoint> 34.0 F (1.1 C)</DewPoint>
<RelativeHumidity> 79%</RelativeHumidity>
<Pressure> 30.42 in. Hg (1030 hPa)</Pressure>
<Status>Success</Status>
</CurrentWeather></string>
,但在第二行(到最后)说encoding="utf-8"
。
所以我尝试使用encoding="utf-16"
:
NSUTF16StringEncoding
这基本上给了我中国人的角色。
我还尝试直接在url上运行解析器而不是返回的NSMutableData,如下所示:
let XMLResponseString = NSString(data: webServiceData!, encoding: NSUTF16StringEncoding)!
(最初的陈述是:
myXMLParser = NSXMLParser(contentsOfURL:theURL!)!
但这些都没有奏效。
那么这里发生了什么?有关如何使其正常工作的任何建议吗?
答案 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"><?xml version="1.0" encoding="utf-16"?>
<CurrentWeather>
<Location>BOSTON LOGAN INTERNATIONAL, MA, United States (KBOS) 42-22N 071-01W 54M</Location>