在iOS中管理XML数据(Swift)

在iOS中管理XML数据(Swift),ios,xml,swift,parsing,Ios,Xml,Swift,Parsing,我正在使用Zillow的基于web的API来检索有关属性的数据。我能够使用NSURLSession成功地获取数据,但是,它是XML格式的,我只有处理JSON的经验 我如何以更可读的形式组织这些数据,更具体地说,我如何获得构建年份(2007)值 NSURL会话代码: func data_request(){ let url:NSURL = NSURL(string: url_to_request)! let session = NSURLSession.sharedSession

我正在使用Zillow的基于web的API来检索有关属性的数据。我能够使用NSURLSession成功地获取数据,但是,它是XML格式的,我只有处理JSON的经验

我如何以更可读的形式组织这些数据,更具体地说,我如何获得构建年份(
2007
)值

NSURL会话代码:

func data_request(){

    let url:NSURL = NSURL(string: url_to_request)!
    let session = NSURLSession.sharedSession()
    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "GET"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData

    let task = session.dataTaskWithRequest(request) {
        (
        let data, let response, let error) in

        if (error == nil){
            //dataString is our XML data
            let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print(dataString)
        }
    }
    task.resume()
}
控制台中打印的数据字符串(XML数据):
可选(

首先,委托“NSXMLParserDelegate”

其次,创建XML解析器并将委托给自己的类

第三,对开始标记使用
parser
的委托函数,如
didStartElement
,对标记内的内容使用
foundCharacters


记住将xml字符串转换为NSData,以便解析器读取。

Lee的答案是正确的。我只是对这个答案进行评论,以便将来遇到这个问题的用户可以尝试相关代码。下面是我的代码:

1) 在类中声明NSXMLParserDelegate

2) 声明NSXMLParser变量:
var解析器:NSXMLParser=NSXMLParser()

3) 在ViewDidDisplay
//url\u to\u请求是我们接收XML数据的url
让url:NSURL=NSURL(字符串:url\u to\u请求)!
parser=NSXMLParser(contentsofull:url)!
parser.delegate=self
parser.parse()

4) 使用XMLParser委托方法

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
    eName = elementName
    //println(eName)
    if elementName == "yearBuilt" {
        self.yearBuilt = String()
    }
    if elementName == "useCode" {
        self.homeType = String()
    }
    if elementName == "lotSizeSqFt" {
        self.lotSizeSqFt = String()
    }
    if elementName == "finishedSqFt" {
        self.finishedSqFt = String()
    }
    if elementName == "bathrooms" {
        self.bathrooms = String()
    }
    if elementName == "bedrooms" {
        self.bedrooms = String()
    }
    if elementName == "totalRooms" {
        self.bedrooms = String()
    }

}

func parser(parser: NSXMLParser, foundCharacters string: String?) {
    let data = string!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    if (!data.isEmpty) {
        //In this example, "yearBuilt", "useCode", etc, are all values within the <> tag.  
        if eName == "yearBuilt" {
            self.yearBuilt += data
            println("Year Built " + self.yearBuilt )
        }
        if eName == "useCode" {
            self.homeType += data
            println("Home Type " + self.homeType )
        }
        if eName == "lotSizeSqFt" {
            self.lotSizeSqFt += data
            println("lotSizeSqFt " + self.lotSizeSqFt )
        }
        if eName == "finishedSqFt" {
            self.finishedSqFt += data
            println("finishedSqFt " + self.finishedSqFt )
        }
        if eName == "bathrooms" {
            self.bathrooms += data
            println("bathrooms " + self.bathrooms )
        }
        if eName == "bedrooms" {
            self.bedrooms += data
            self.bedroomLabel.text = self.bedrooms
            println("bedrooms " + self.bedrooms )
        }

        if eName == "totalRooms" {
            self.totalRooms += data
            println("totalRooms " + self.totalRooms )
        }


    }
}

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    self.homeTypeLabel.text = self.homeType


    self.yearBuiltLabel.text = self.yearBuilt
    self.lotSizeLabel.text = self.lotSizeSqFt
    self.finishedSquareFeetLabel.text = self.finishedSqFt
    self.bathroomsLabel.text = self.bathrooms
    self.totalRoomsLabel.text = self.totalRooms



}
func解析器(解析器:NSXMLParser,didStartElement元素名称:String,namespaceURI:String?,限定名称qName:String?,属性attributeDict:[NSObject:AnyObject]){
eName=elementName
//println(eName)
如果elementName==“YearBuild”{
self.yearbuild=String()
}
如果elementName==“useCode”{
self.homeType=String()
}
如果elementName==“lotSizeSqFt”{
self.lotSizeSqFt=String()
}
如果elementName==“finishedSqFt”{
self.finishedSqFt=String()
}
如果elementName==“浴室”{
self.bathrooms=String()
}
如果elementName==“卧室”{
self.beddooms=String()
}
如果elementName==“totalRooms”{
self.beddooms=String()
}
}
func解析器(解析器:NSXMLParser,foundCharacters string:string?){
让数据=字符串!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
如果(!data.isEmpty){
//在本例中,“YearBuild”、“useCode”等都是标记中的值。
如果eName==“YearBuild”{
自建+=数据
println(“建成年份”+自建年份)
}
如果eName==“useCode”{
self.homeType+=数据
println(“主页类型”+self.homeType)
}
如果eName==“lotSizeSqFt”{
self.lotSizeSqFt+=数据
println(“lotSizeSqFt”+self.lotSizeSqFt)
}
如果eName==“finishedSqFt”{
self.finishedSqFt+=数据
println(“finishedSqFt”+self.finishedSqFt)
}
如果eName==“浴室”{
self.bathrooms+=数据
println(“浴室”+自助浴室)
}
如果eName==“卧室”{
self.beddooms+=数据
self.beddroomlabel.text=self.beddrooms
println(“卧室”+独立卧室)
}
如果eName==“totalRooms”{
self.totalRooms+=数据
println(“totalRooms”+self.totalRooms)
}
}
}
func解析器(解析器:NSXMLParser,didEndElement元素名称:String,namespaceURI:String?,qualifiedName qName:String?){
self.hometypelab.text=self.homeType
self.yearBuiltLabel.text=self.yearBuild
self.lotSizeLabel.text=self.lotSizeSqFt
self.finishedSquareFeetLabel.text=self.finishedSqFt
self.bathroomsLabel.text=self.bathrooms
self.totalRoomsLabel.text=self.totalRooms
}

除非最近有所更改,否则iOS内置的NSXMLParser是SAX解析器,需要遍历整个XML结构&3个委托方法1)找到所需的开始标记,2)提取内容,3)找到结束标记。有几个第三方DOM解析器可以更轻松地将整个文件加载到内存和目标特定元素中。这篇文章很旧,但可能仍然提供了一些相关提示:我就是这样发现的。