我的应用程序正在调用以下 URL 中的免费天气预报 Web 服务: http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=Boston&CountryName=United+States
我使用的是通常的NSURLConnection
和NSXMLParser
委托(delegate)方法来解析传入的数据(我之前已经这样做了一百万次),但很奇怪的是, NSMutableData
返回的内容未通过 NSUTF8StringEncoding
正确转换为字符串。它基本上无法转换开始和结束 XML 标记的“<”和“">”字符,给了我“<”和“&g t;”反而。
问题似乎出在 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
得到的输出声明有:
<?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>
正如你所看到的,我正确地获取了前 2 个标签 - “< ?XML >” 和 “< string xmlns >” 标签,但其余的都显示为 “& l t;”和“&g t;”
真正奇怪的是它说encoding="utf-8"
对于第一个标签,但在第二行(接近结尾)它说 encoding="utf-16"
.
所以我尝试使用 NSUTF16StringEncoding
:
let XMLResponseString = NSString(data: webServiceData!, encoding: NSUTF16StringEncoding)!
这基本上给了我看起来像中国人的角色。
我还尝试直接在 url 上运行解析器,而不是返回的 NSMutableData,如下所示:
myXMLParser = NSXMLParser(contentsOfURL:theURL!)!
(原文是这样的:
myXMLParser = NSXMLParser(data:webServiceData)
但是这些都不起作用。
那么这是怎么回事?关于如何使其正常工作有什么建议吗?
最佳答案
这实际上是远程服务被破坏,而不是您的代码。是的,服务器确实在 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>
关于string - Swift String 编码和 NSXMLParser 解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27707865/