티스토리 뷰


가끔은 JSON이 아닌 XML을 파싱해야할 경우가 있다.

공공데이터는 XML도 아직 많이 있다고 들은 것 같기도 하고?


일단 결과부터 보고 시작

import UIKit
class ViewController: UIViewController,NSXMLParserDelegate {
var strXMLData:String = ""
var currentElement:String = ""
var passData:Bool=false
var passName:Bool=false
var parser = NSXMLParser()
@IBOutlet var lblNameData : UILabel! = nil
override func viewDidLoad() {
super.viewDidLoad()
let url:String="http://api.androidhive.info/pizza/?format=xml"
let urlToSend: NSURL = NSURL(string: url)!
// Parse the XML
parser = NSXMLParser(contentsOfURL: urlToSend)!
parser.delegate = self
let success:Bool = parser.parse()
if success {
print("parse success!")
print(strXMLData)
lblNameData.text=strXMLData
} else {
print("parse failure!")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
currentElement=elementName;
if(elementName=="id" || elementName=="name" || elementName=="cost" || elementName=="description")
{
if(elementName=="name"){
passName=true;
}
passData=true;
}
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
currentElement="";
if(elementName=="id" || elementName=="name" || elementName=="cost" || elementName=="description")
{
if(elementName=="name"){
passName=false;
}
passData=false;
}
}
func parser(parser: NSXMLParser, foundCharacters string: String) {
if(passName){
strXMLData=strXMLData+"\n\n"+string
}
if(passData)
{
print(string)
}
}
func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
NSLog("failure error: %@", parseError)
}
}


1. Singleview project에서 이 코드를 그대로 복붙하고 스토리보드에서 UILabel하나만 생성하여 연결해줍시다.

(+UILabel의 numberOfLines는 좀 여유있게 20정도 잡아줬어요.)

(+ats도 해결해줍시다. 참조:http://rhammer.tistory.com/67)




http://api.androidhive.info/pizza/?format=xml에 있는 피자메뉴의 이름만 가져왔네요.



2. NSXMLParser

NSXMLParser는 XML문서를 분석하는 클래스입니다. XML문서를 읽으며 태그를 만날때 마다 이를 delegate에 알려주면 delegate에서 해당 태그와 태그아래에 있는 문자열을 통해 원하는 작업을 하게 되는 것입니다.

이 작업은 ViewController.swift의 22번째 줄 let success:Bool = parser.parse()에서 시작됩니다. 


NSXMLParser의 메소드 parse()는 XML파싱이 성공적으로 끝나면 true를 중간에 에러가 발생하여 실패하면 false를 리턴합니다.




3. NSXMLParserDelegate

델리게이트에는 3가지 주요한 메소드가 있습니다.

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
// parser가 시작 태그를 만나면 호출됩니다. Ex) <name>
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)
// parser가 닫는 태그를 만나면 호출됩니다. Ex) </name>
func parser(parser: NSXMLParser, foundCharacters string: String)
// 현재 태그에 담겨있는 string이 전달됩니다.



출처: http://rhammer.tistory.com/131 [고무망치]

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함