Файл 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]
  ]
}

0 ответов

Другие вопросы по тегам