我想解析Swift中的XML文件,並且在理解NSMutableDictionary如何在存儲數值的過程中遇到一些麻煩元素。解析Swift中的XML文件(Xcode v 7.0.1)並從字典中檢索值
的XML文件看起來像這樣,
<coord2 count="6">
<markers>
<marker>
<lat>36.99058167</lat>
<lng>-122.06620333</lng>
<timestamp>1444931620</timestamp>
<route>LOOP</route>
<id>7855</id>
<predictions>
,4,5,,6,7,,,,10,,,11,,11,,13,15,,14,,,16,,,0,,,2,,,,,,,,,,,,,,
</predictions>
<update_seconds>10</update_seconds>
<index>4</index>
</marker>
<marker>
<lat>36.99296</lat>
<lng>-122.06517333</lng>
<timestamp>1444934786</timestamp>
<route>UPPER CAMPUS</route>
<id>7860</id>
<predictions>
15,,,14,,,13,12,11,,10,9,,8,,7,,,6,,5,4,,3,2,,1,0,,,,,,,,,,,,,,,
</predictions>
<update_seconds>10</update_seconds>
<index>4</index>
</marker>
</markers>
<curr_time>1444931622</curr_time>
</coord2>
我試圖解析XML文件的方法是使用下面的代碼,我從一個教程發現在 http://www.theappguruz.com/blog/xml-parsing-using-nsxmlparse-swift
import UIKit
import GoogleMaps
class ViewController: UIViewController, NSXMLParserDelegate {
var parser = NSXMLParser()
var posts = NSMutableArray()
var elements = NSMutableDictionary()
var element = NSString()
var route = NSMutableString()
var timestamp = NSMutableString()
func beginParsing()
{
posts = []
parser = NSXMLParser(contentsOfURL:(NSURL(string:"http://xmfile.xml"))!)!
parser.delegate = self
parser.parse()
}
override func viewDidLoad() {
super.viewDidLoad()
beginParsing()
print("The route is")
let t = elements["route"]!
print(t)
print("The timestamp is")
let u = elements["timestamp"]!
print(u)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// didStartElement
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
{
element = elementName
if (elementName as NSString).isEqualToString("marker")
{
elements = NSMutableDictionary()
elements = [:]
route = NSMutableString()
route = ""
timestamp = NSMutableString()
timestamp = ""
}
}
// foundCharacters
func parser(parser: NSXMLParser, foundCharacters string: String)
{
if element.isEqualToString("route") {
route.appendString(string)
} else if element.isEqualToString("timestamp") {
timestamp.appendString(string)
}
}
// didEndElement
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)
{
if (elementName as NSString).isEqualToString("marker") {
if !route.isEqual(nil) {
elements.setObject(route, forKey: "route")
}
if !timestamp.isEqual(nil) {
elements.setObject(timestamp, forKey: "timestamp")
}
posts.addObject(elements)
}
}
}
現在我只關注「路由」和「時間戳」元素,以便了解分析的工作原理。輸出我得到的,當我
let t = elements["route"]!
print(t)
print("previous is route")
let u = elements["timestamp"]!
print(u)
print("previous is timestamp")
始終是在XML文件中的名稱最後元素的值。所以,對於我提供的6行的代碼的輸出處的示例XML文件上面會
路線是
UPPER校園
該時間戳爲
我希望能夠區分多個「」標記「elem瀏覽XML文件並檢索標記內元素的值。換句話說,能夠獲得第一個標記內元素的值,而不僅僅是最後一個。我會如何去做這件事?
你是否需要使用NSMutableDictionary/NSMutableArray或創建類來表示Coord2/Marker是一個選項?我想問的原因是,如果你可以使用自定義類,你可以使用另一種方法來乾淨地解析你的XML,並有更多可管理的代碼... – Benzi
感謝您的迴應。現在,我接受建議。我對Swift很陌生,所以我在學習。我如何用自定義類來完成這個任務? – Ivan
好的...我已經爲你提供了一個答案;請在下面查看。 – Benzi