Файл IOS- GPX parser.parse() Операция не может быть завершена
Я разочарован тем, что не могу понять, почему мой код ниже не анализирует содержимое файла GPX, учитывая, что у меня есть достаточное количество методов делегата XMLParserDelegate.
Вот первый входной файл GPX
<?xml version="1.0"?>
<gpx version="1.1" creator="Xcode">
<wpt lat="42.373734" lon="-71.178314">
<name>A's house</name>
</wpt>
<wpt lat="41.094082" lon="-73.519411">
<name>B's Office</name>
</wpt>
<wpt lat="42.350816" lon="-71.065578">
<name>W Hotel</name>
</wpt>
<wpt lat="42.352291" lon="-71.045283">
<name>District Hall</name>
</wpt>
</gpx>
Я также гарантирую, что путь к каталогу файла GPX будет добавлен в Bundle Resource проекта. Здесь я только хочу проанализировать значение, присвоенное ключевым словам lat и lon, из тега элемента < wpt >.
Из быстрого поиска я подумал, что из справки, мне просто нужно получить этот метод делегата func parser(_ parser: XMLParser, didStartElement elementName: String, ...)
, Пожалуйста, не стесняйтесь исправить мое предположение здесь, я думаю, что мне нужен только этот делегат, так как я просто ищу материал после тега элемента < wpt >, нет необходимости func parser(_ parser: XMLParser, foundCharacters string: String)
Когда я отлаживаю разбор, я получил locArray
быть ноль!!! Итак, я не понимаю, почему следующий код не анализирует содержимое в массиве.
class AutoCheckInVC: UIViewController, UITableViewDataSource, UITableViewDelegate, CLLocationManagerDelegate, XMLParserDelegate{
.........
private var element: String?
private var locArray = [String]()
private var parser : XMLParser = XMLParser()
func beginParsing(){
guard let path = Bundle.main.path(forResource: "TestLocations", ofType: "gpx") else {
NSLog("Couldn't find the gpx file!!!")
return
}
guard let url = URL(string: path) else {
preconditionFailure("URL is nil!!!")
}
guard let parser = XMLParser(contentsOf: url) else {
preconditionFailure("XML file is nil!!!")
}
parser.delegate = self
let beParsed = parser.parse()
if beParsed {
NSLog("Start an event-driving parsing")
}
else {
preconditionFailure("Failed to start parsing")
}
}
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
element = elementName
/** The code doesn't execute inside the if part. Why???**/
if (element == "wpt") {
//create the string array from the file
let long = attributeDict["lon"]!
let lat = attributeDict["lat"]!
self.curLL = "\(lat),\(long)" as String?
debugPrint("Lon, Lat of current point is: \(String(describing: self.curLL))")
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
let data = string.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)
if (!data.isEmpty) {
if (element == "wpt"){
locArray[data] = self.curLL as String?
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
beginParsing() /*****Something wrong here!!!****/
debugPrint("LocArray: \(locArray)")
for i in 0..<venue.numOfElements() {
let venueTemp = venue.readHistory(atIndex: i)
let para1: Parameters = [
//Required: name, ll, and version date
"ll": locArray[i]
]
}