{"id":1159,"date":"2017-10-06T15:47:21","date_gmt":"2017-10-06T06:47:21","guid":{"rendered":"http:\/\/blue-bear.jp\/kb\/?p=1159"},"modified":"2017-10-06T15:47:21","modified_gmt":"2017-10-06T06:47:21","slug":"swift4-xmlparser%e3%81%a7xml%e3%82%92%e8%aa%ad%e3%81%bf%e8%be%bc%e3%81%bf%e3%80%81tableview%e3%81%ab%e5%8f%8d%e6%98%a0","status":"publish","type":"post","link":"https:\/\/blue-bear.jp\/kb\/swift4-xmlparser%e3%81%a7xml%e3%82%92%e8%aa%ad%e3%81%bf%e8%be%bc%e3%81%bf%e3%80%81tableview%e3%81%ab%e5%8f%8d%e6%98%a0\/","title":{"rendered":"[swift4] XMLparser\u3067XML\u3092\u8aad\u307f\u8fbc\u307f\u3001TableView\u306b\u53cd\u6620"},"content":{"rendered":"<p>XMLparser\u3067XML\u3092\u8aad\u307f\u8fbc\u307f\u3001TableView\u306b\u53cd\u6620\u3055\u305b\u308b\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u306e\u3088\u3046\u306b\u5b9f\u88c5\u3059\u308b<\/p>\n<p>XMLParserDelegate\u3092\u5b9f\u88c5\u3057\u3066\u3001Delegete\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u3054\u3068\u306b\u914d\u5217\u3092\u4f5c\u6210\u3057\u3001XML\u306e\u8aad\u307f\u8fbc\u307f\u304c\u7d42\u4e86\u3057\u305f\u3089\u3001TableView\u3092Reload\u3059\u308b\u3002<\/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\u306e\u30d5\u30a3\u30fc\u30c9\u53d6\u5f97\u7528URL\r\n    let feedUrl : NSURL = NSURL(string:\"xxxxx.xml\")!\r\n    \r\n    \/\/XML\u306e\u73fe\u5728\u8981\u7d20\u540d\u3092\u5165\u308c\u308b\u5909\u6570\r\n    var currentElementName : String!\r\n    \r\n    \/\/\u53d6\u5f97\u3059\u308b\u8981\u7d20\u540d(\u3068\u308a\u306f\u3058\u3081\u306e\u8981\u7d20)\r\n    let itemElementName : String  = \"item\"\r\n    \r\n    \/\/\u53d6\u5f97\u3059\u308b\u8981\u7d20\u540d\u306e\u6c7a\u5b9a(item\u8981\u7d20\u306e\u4e0b\u306b\u3042\u308b\u3082\u306e)\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    \/\/\u5404\u30a8\u30ec\u30e1\u30f3\u30c8\u7528\u306e\u5909\u6570\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        \/\/NSXMLParser\u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u6e96\u5099\r\n        let parser : XMLParser = XMLParser(contentsOf: feedUrl as URL)!\r\n        if parser != nil {\r\n            \/\/ XMLParserDelegate\u3092\u30bb\u30c3\u30c8\r\n            parser.delegate = self;\r\n            parser.parse()\r\n            \/\/print(\"parser.parse\")\r\n            \r\n        } else {\r\n            \/\/ \u30d1\u30fc\u30b9\u306b\u5931\u6557\u3057\u305f\u6642\r\n            print(\"failed to parse XML\")\r\n        }\r\n    }\r\n    \r\n    \/\/XML\u3092\u8aad\u307f\u8fbc\u307f\u958b\u59cb\r\n    func parserDidStartDocument(_ parser: XMLParser) {\r\n        \/\/print(\"parserDidStartDocument\")\r\n    }\r\n    \r\n    \/\/XML\u306e\u8aad\u307f\u8fbc\u307f\u7d42\u4e86\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    \/\/\u5404\u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u8aad\u307f\u8fbc\u307f\u958b\u59cb\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        \/\/\u8981\u7d20\u540d\u304c\u300citem\u300d\u306e\u8981\u7d20\u304c\u898b\u3064\u304b\u3063\u305f\u5834\u5408\u306b\u306f\u4e0a\u3067\u8a2d\u5b9a\u3057\u305f\u30e1\u30f3\u30d0\u5909\u6570\u3092\u521d\u671f\u5316\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    \/\/\u5404\u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u4e2d\u306e\u8981\u7d20\u3092\u898b\u3064\u3051\u305f\u5834\u5408\u306e\u30e1\u30bd\u30c3\u30c9\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    \/\/\u6539\u884c\u3068\u534a\u89d2\u30b9\u30da\u30fc\u30b9\u306e\u9664\u53bb\r\n    func strip(str: String) -> String {\r\n        var strBr: String\r\n        var strSp: String\r\n        \/\/\u6539\u884c\u9664\u53bb\r\n        strBr = str.replacingOccurrences(of:\"\\n\", with: \"\")\r\n        \/\/\u534a\u89d2\u30b9\u30da\u30fc\u30b9\u9664\u53bb\r\n        strSp = strBr.replacingOccurrences(of:\" \", with: \"\")\r\n        return strSp\r\n    }\r\n    \r\n    \/\/\u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u8aad\u307f\u8fbc\u307f\u304c\u7d42\u4e86\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            \/\/\u5404\u30e1\u30f3\u30d0\u5909\u6570\u304cnil\u3067\u306a\u3051\u308c\u3070\u30e1\u30f3\u30d0\u5909\u6570elements\u3078\u300c\u30ad\u30fc\u300d\u3068\u300c\u5024\u300d\u306e\u30da\u30a2\u3092\u683c\u7d0d\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    \/\/\u30bb\u30eb\u306e\u6570\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 \/\/\u6700\u521d\u3082\u3057\u304f\u306fXML\u304c\u8aad\u307f\u8fbc\u307e\u306a\u308c\u306a\u304b\u3063\u305f\u5834\u5408\u306f10\u884c\r\n    }\r\n    \r\n    \r\n    \/\/ section\u306e\u6570\u3092\u6c7a\u3081\u308b\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\u306e\u30bb\u30eb\u306e\u8a2d\u5b9a\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 \/\/\u30a4\u30e1\u30fc\u30b8\u521d\u671f\u5316\r\n        \r\n        let label = cell.contentView.viewWithTag(2) as! UILabel\r\n        \r\n        \/\/\u30a4\u30e1\u30fc\u30b8\u8aad\u307f\u8fbc\u307f\u306e\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\r\n        let indicator = cell.contentView.viewWithTag(3) as! UIActivityIndicatorView\r\n        indicator.startAnimating()\r\n        indicator.isHidden = true\r\n        \r\n        \/\/\u8981\u7d20\u3092\u8aad\u307f\u3053\u3093\u3060posts\u304c\u3042\u308c\u3070\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            \/\/\u753b\u50cf\u306e\u8aad\u307f\u8fbc\u307f\uff08Optional\u306e\u578b\u306enil\u5224\u5b9a\u304c\u3046\u307e\u304f\u884c\u304b\u305a\uff12\u6bb5\u78ba\u8a8d\u306b\u306a\u3063\u3066\u3057\u307e\u3063\u305f\uff09\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                    \/\/\u753b\u50cf\u306e\u975e\u540c\u671f\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\uff08\u305f\u3060\u3057\u30ad\u30e3\u30c3\u30b7\u30e5\u3055\u308c\u306a\u3044\u306e\u3067\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b9f\u88c5\u304c\u5fc5\u8981\uff09\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                \/\/\u753b\u50cf\u304c\u306a\u3044\u5834\u5408\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>XMLparser\u3067XML\u3092\u8aad\u307f\u8fbc\u307f\u3001T<\/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\/1159"}],"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=1159"}],"version-history":[{"count":1,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/posts\/1159\/revisions"}],"predecessor-version":[{"id":1160,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/posts\/1159\/revisions\/1160"}],"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=1159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/categories?post=1159"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blue-bear.jp\/kb\/wp-json\/wp\/v2\/tags?post=1159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}