我想解析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