[英]parsing XML with SwiftyXMLParser Alamofire
我正在嘗試以 XML 格式解析從 Web 服務器 API 收到的最后一項,但我完全無法理解如何獲取sky_condition
的數據(對服務器使用沒有太多解釋,顯然不是矢量)
正如您在下面從樹視圖中看到的,我可以獲得所有預測數據示例, fcst_time_from
或wind_dir_degrees
使用以下代碼(我縮短了代碼,所有這些代碼都在 Alamo 請求中,在 for 循環中以獲得特定機場的所有預測,可以不止一個)
let winddirdegrees = parsedData.response.data.TAF.forecast[index].wind_dir_degrees.int
但是,當我嘗試獲取sky_condition
它不起作用。
let skycondition = parsedData.response.data.TAF.forecast[index].sky_condition.sky_cover.text
我在這里發布了那部分的 xml 代碼:以及帶有完整 XML 鏈接 XML 的鏈接
</forecast>
<forecast>
<fcst_time_from>2020-02-02T03:00:00Z</fcst_time_from>
<fcst_time_to>2020-02-02T05:00:00Z</fcst_time_to>
<change_indicator>BECMG</change_indicator>
<time_becoming>2020-02-02T04:00:00Z</time_becoming>
<wind_dir_degrees>260</wind_dir_degrees>
<wind_speed_kt>6</wind_speed_kt>
<visibility_statute_mi>3.73</visibility_statute_mi>
<wx_string>NSW</wx_string>
<sky_condition sky_cover="FEW" cloud_base_ft_agl="3500" />
</forecast>
不幸的是,該網站沒有提供太多關於他們只是在解釋中顯示此 xml 的解釋
<xsd:element name="sky_condition">
<xsd:complexType>
<xsd:attribute name="sky_cover" type="xsd:string"/>
<xsd:attribute name="cloud_base_ft_agl" type="xsd:int"/>
<xsd:attribute name="cloud_type" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
在此先感謝您的幫助。
這可能會幫助你,
fileprivate class XmlToDictionaryParserDelegate: NSObject, XMLParserDelegate {
private var currentElement: XmlElement?
fileprivate init(_ element: XmlElement) {
self.currentElement = element
}
public func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
self.currentElement = self.currentElement?.pop(elementName)
}
public func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
self.currentElement = self.currentElement?.push(elementName)
self.currentElement?.attributeDict = attributeDict
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
self.currentElement?.text += string
}
}
public class XmlElement {
public private(set) var name = "unnamed"
public private(set) var children = [String: XmlElement]()
public private(set) var parent: XmlElement? = nil
public fileprivate(set) var text = ""
public fileprivate(set) var attributeDict: [String : String] = [:]
private init(_ parent: XmlElement? = nil, name: String = "") {
self.parent = parent
self.name = name
}
public convenience init?(fromString: String) {
guard let data = fromString.data(using: .utf8) else {
return nil
}
self.init(fromData: data)
}
public init(fromData: Data) {
let parser = XMLParser(data: fromData)
let delegate = XmlToDictionaryParserDelegate(self)
parser.delegate = delegate
parser.parse()
}
fileprivate func push(_ elementName: String) -> XmlElement {
let childElement = XmlElement(self, name: elementName)
children[elementName] = childElement
return childElement
}
fileprivate func pop(_ elementName: String) -> XmlElement? {
assert(elementName == self.name)
return self.parent
}
public subscript(name: String) -> XmlElement? {
return self.children[name]
}
}
你可以像下面這樣使用,
let url = URL(string: "APIURL")
var xmlRequest = URLRequest(url: url!)
xmlRequest.httpBody = stringParams.data(using: String.Encoding.utf8, allowLossyConversion: true)
xmlRequest.httpMethod = "POST"
xmlRequest.addValue("application/xml", forHTTPHeaderField: "Content-Type")
Alamofire.request(xmlRequest)
.responseData { (response) in
guard let jsonData = response.data, let stringResponse: String = String(data: jsonData, encoding: String.Encoding.utf8) else {return}
guard let xml = XmlElement(fromString: stringResponse) else { return }
let status = xml["sky_condition"]?.text
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.