簡體   English   中英

使用 SwiftyXMLParser Alamofire 解析 XML

[英]parsing XML with SwiftyXMLParser Alamofire

我正在嘗試以 XML 格式解析從 Web 服務器 API 收到的最后一項,但我完全無法理解如何獲取sky_condition的數據(對服務器使用沒有太多解釋,顯然不是矢量)

正如您在下面從樹視圖中看到的,我可以獲得所有預測數據示例, fcst_time_fromwind_dir_degrees

XML 的樹視圖

使用以下代碼(我縮短了代碼,所有這些代碼都在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM