{"id":1161,"date":"2017-10-06T15:58:52","date_gmt":"2017-10-06T06:58:52","guid":{"rendered":"http:\/\/blue-bear.jp\/kb\/?p=1161"},"modified":"2017-10-06T15:58:52","modified_gmt":"2017-10-06T06:58:52","slug":"swift4-read-xml-via-xmlparser-and-reflect-with-tableview","status":"publish","type":"post","link":"https:\/\/blue-bear.jp\/kb\/swift4-read-xml-via-xmlparser-and-reflect-with-tableview\/","title":{"rendered":"[swift4] Read XML via XMLparser and Reflect with TableView"},"content":{"rendered":"<p>Code For Read XML via XMLparser and Reflect with TableView is below<\/p>\n<p>Install XMLParserDelegate &#038; Create array on Delegete Response<\/p>\n<p>Once complete to read XML, Reload TableView<\/p>\n<pre>\r\n\r\nimport UIKit\r\n\r\nclass testTableViewContoller: UIViewController, UITableViewDelegate, UITableViewDataSource,XMLParserDelegate{\r\n    \r\n    @IBOutlet weak var tableView: UITableView!\r\n    \r\n    \/\/XML Feed URL\r\n    let feedUrl : NSURL = NSURL(string:\"xxxxx.xml\")!\r\n    \r\n    \/\/for current Element\r\n    var currentElementName : String!\r\n    \r\n    \/\/First Element name\r\n    let itemElementName : String  = \"item\"\r\n    \r\n    \/\/Element name under item element\r\n    let nameElementName  : String = \"name\"\r\n    let makerElementName : String = \"maker\"\r\n    let priceElementName : String = \"price\"\r\n    let typeElementName  : String = \"type\"\r\n    let urlElementName   : String = \"url\"\r\n    let imageElementName : String = \"image\"\r\n    \r\n    \/\/variable for each element\r\n    var posts:[Dictionary<String, String>]!\r\n    var elements:Dictionary = [String: String]()\r\n    var element:String!\r\n    var name:String!\r\n    var maker:String!\r\n    var price:String!\r\n    var type:String!\r\n    var url:String!\r\n    var image:String!\r\n    \r\n    \/\/MARK: didload\r\n    override func viewDidLoad() {\r\n        super.viewDidLoad()\r\n        \r\n        tableView.dataSource = self\r\n        tableView.delegate = self\r\n        \r\n        posts = []\r\n        \r\n    }\r\n    \r\n    override func viewDidAppear(_ animated: Bool) {\r\n        \/\/XMLParser Class\r\n        let parser : XMLParser = XMLParser(contentsOf: feedUrl as URL)!\r\n        if parser != nil {\r\n            \/\/ XMLParserDelegate setup\r\n            parser.delegate = self;\r\n            parser.parse()\r\n            \/\/print(\"parser.parse\")\r\n            \r\n        } else {\r\n            \/\/ Fail to parse\r\n            print(\"failed to parse XML\")\r\n        }\r\n    }\r\n    \r\n    \/\/Start to read XML\r\n    func parserDidStartDocument(_ parser: XMLParser) {\r\n        \/\/print(\"parserDidStartDocument\")\r\n    }\r\n    \r\n    \/\/Complete to read XML\r\n    func parserDidEndDocument(_ parser: XMLParser!)\r\n    {\r\n        print(\"reload table\")\r\n        self.tableView.reloadData() \/\/TableView\u3092Reload\r\n    }\r\n\r\n    \/\/Start to read each element\r\n    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {\r\n        \r\n        self.element = elementName as String\r\n        \r\n        \/\/Initiate each variable for element once find \"item\" element\r\n        if (elementName as NSString).isEqual(to: self.itemElementName){\r\n            self.elements = [:]\r\n            self.name = \"\"\r\n            self.maker = \"\"\r\n            self.price = \"\"\r\n            self.type = \"\"\r\n            self.url = \"\"\r\n            self.image = \"\"\r\n        }\r\n    }\r\n    \r\n    \/\/Method when find each element on \"item\" element\r\n    func parser(_ parser: XMLParser, foundCharacters string: String){\r\n        \r\n        if self.element.isEqual(self.nameElementName) {\r\n            self.name.append(\r\n                strip(str:string)\r\n            )\r\n        }\r\n        \r\n        if self.element.isEqual(self.makerElementName) {\r\n            self.maker.append(\r\n                strip(str:string)\r\n            )\r\n        }\r\n        \r\n        if self.element.isEqual(self.priceElementName) {\r\n            self.price.append(\r\n                strip(str:string)\r\n            )\r\n        }\r\n        \r\n        if self.element.isEqual(self.typeElementName) {\r\n            self.type.append(\r\n                strip(str:string)\r\n            )\r\n        }\r\n        \r\n        if self.element.isEqual(self.urlElementName) {\r\n            self.url.append(\r\n                strip(str:string)\r\n            )\r\n        }\r\n        \r\n        if self.element.isEqual(self.imageElementName) {\r\n            self.image.append(\r\n                strip(str:string)\r\n            )\r\n        }\r\n    }\r\n    \r\n    \/\/Remove space & line break\r\n    func strip(str: String) -> String {\r\n        var strBr: String\r\n        var strSp: String\r\n        \/\/Remove line break\r\n        strBr = str.replacingOccurrences(of:\"\\n\", with: \"\")\r\n        \/\/remove space\r\n        strSp = strBr.replacingOccurrences(of:\" \", with: \"\")\r\n        return strSp\r\n    }\r\n    \r\n    \/\/Complete to read element\r\n    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {\r\n        \r\n        if (elementName as NSString).isEqual(to: self.itemElementName) {\r\n            \r\n            \/\/set \"key\"&\"value\" into variable for element if each element is not nil\r\n            if !self.name.isEqual(nil) {\r\n                self.elements[nameElementName] = self.name\r\n            }\r\n            \r\n            if !self.maker.isEqual(nil) {\r\n                self.elements[makerElementName] = self.maker\r\n            }\r\n            \r\n            if !self.price.isEqual(nil) {\r\n                self.elements[priceElementName] = self.price\r\n            }\r\n            \r\n            if !self.type.isEqual(nil) {\r\n                self.elements[typeElementName] = self.type\r\n            }\r\n            \r\n            if !self.url.isEqual(nil) {\r\n                self.elements[urlElementName] = self.url\r\n            }\r\n            \r\n            if !self.image.isEqual(nil) {\r\n                self.elements[imageElementName] = self.image\r\n            }\r\n            self.posts.append(self.elements)\r\n        }\r\n    }\r\n\r\n    \r\n    override func didReceiveMemoryWarning() {\r\n        super.didReceiveMemoryWarning()\r\n    }\r\n    \r\n    \/\/Amount of Cell\r\n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\r\n        \r\n        if posts.count > 0{\r\n            return posts.count\r\n        }\r\n        return 10 \/\/if posts count is 0\r\n    }\r\n    \r\n    \r\n    \/\/ section\r\n    func numberOfSections(in tableView: UITableView) -> Int { \r\n        return 1\r\n    }\r\n    \r\n    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {\r\n        return 50\r\n    }\r\n    \r\n    \/\/TableView Cell Setting\r\n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\r\n        \r\n        let cell = tableView.dequeueReusableCell(withIdentifier: \"tableCell\", for: indexPath)\r\n        \r\n        let imageView = cell.contentView.viewWithTag(1) as! UIImageView\r\n        imageView.image = nil \/\/imageView initiate\r\n        \r\n        let label = cell.contentView.viewWithTag(2) as! UILabel\r\n        \r\n        \/\/Indicator for loading image\r\n        let indicator = cell.contentView.viewWithTag(3) as! UIActivityIndicatorView\r\n        indicator.startAnimating()\r\n        indicator.isHidden = true\r\n        \r\n        \/\/if posts count is not 0\r\n        if(posts.count>0){\r\n            if let name = posts[indexPath.row][\"name\"] {\r\n                label.text = name as? String\r\n            } else {\r\n                label.text = \"\"\r\n            }\r\n            \r\n            \/\/Asymmetrical image download (but need to setup cache method)\r\n            if let imageURL:String = posts[indexPath.row][\"image\"] {\r\n                if(!imageURL.isEmpty){\r\n                    \r\n                    indicator.isHidden = false\r\n                    \r\n                    let catPictureURL = URL(string: imageURL)\r\n                    let session = URLSession(configuration: .default)\r\n                    let downloadPicTask = session.dataTask(with: catPictureURL!) { (data, response, error) in\r\n                        \/\/ The download has finished.\r\n                        \r\n                        indicator.isHidden = true\r\n                        \r\n                        if let e = error {\r\n                            print(\"Error downloading cat picture: \\(e)\")\r\n                        } else {\r\n                            if let res = response as? HTTPURLResponse {\r\n                                print(\"Downloaded cat picture with response code \\(res.statusCode)\")\r\n                                if let imageData = data {\r\n                                    imageView.image = UIImage(data: imageData)\r\n                                } else {\r\n                                    print(\"Couldn't get image: Image is nil\")\r\n                                }\r\n                            } else {\r\n                                print(\"Couldn't get response code for some reason\")\r\n                            }\r\n                        }\r\n                    }\r\n                    downloadPicTask.resume()\r\n                }\r\n            }else{\r\n                \/\/if no image\r\n            }\r\n        }\r\n        \r\n        return cell\r\n        \r\n    } \r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Code For Read XML vi<\/p>\n","protected":false},"author":1,"featured_media":88,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/posts\/1161"}],"collection":[{"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/comments?post=1161"}],"version-history":[{"count":1,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/posts\/1161\/revisions"}],"predecessor-version":[{"id":1162,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/posts\/1161\/revisions\/1162"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/media\/88"}],"wp:attachment":[{"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/media?parent=1161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/categories?post=1161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/tags?post=1161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}