string - Swift String 编码和 NSXMLParser 解析问题

标签 string swift encoding nsxmlparser

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

我使用的是通常的NSURLConnectionNSXMLParser委托(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">&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>

正如你所看到的,我正确地获取了前 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">&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;

关于string - Swift String 编码和 NSXMLParser 解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27707865/

相关文章:

javascript - 删除字符串中元音之前的所有辅音,然后添加一个字符

c# - 将大量 ASCII 值(以字符串形式)转换为可读文本 C#

ios - 如何在 Swift 中将按钮图像设置为 nil?

java - 对 cookie 中设置的电子邮件地址进行转义/解码

PHP使用字符串指向一个函数

javascript - 检查字符串的第一个字符是否为数字会报错,表明 charat 不是有效方法

swift - 将前导零添加到将与文本一起打印在字符串中的数字

swift - Swift脚本中的崩溃是否是由竞争条件引起的?

Angular 5 文件保存程序将 CSV 文件编码为 ANSI

node.js - 使用 Meteor (CFS) 下载远程图像