从Swift 3.0中的主Bundle加载XML文件

时间:2016-10-28 03:37:12

标签: swift nsxmlparser nsxmlparserdelegate

我有.GPX文件包含徒步旅行的路线信息,我想加载到我的应用程序中。如果我从远程URL(https://dl.dropboxusercontent.com/u/45741304/appsettings/Phu_si_Lung_05_01_14.gpx)加载它,一切都可以,但是我无法从应用程序包中加载这个相同的文件(已经在“复制包资源”中并具有正确的目标成员资格)。

以下是我从远程网址加载此文件的代码:

var xmlParser: XMLParser!


func startParsingFileFromURL(urlString: String) {
    guard let url = URL(string: urlString) else {
        print("Can't load URL: \(urlString)")
        return
    }
    self.xmlParser = XMLParser(contentsOf: url)
    self.xmlParser.delegate = self
    let result = self.xmlParser.parse()
    print("parse from URL result: \(result)")
    if result == false {
        print(xmlParser.parserError?.localizedDescription)
    }

}

并从主要包中:

func startParsingFile(fileName: String, fileType: String) {
    guard let urlPath = Bundle.main.path(forResource: fileName, ofType: fileType) else {
        print("Can't load file \(fileName).\(fileType)")
        return
    }
    guard let url:URL = URL(string: urlPath) else {
        print("Error on create URL to read file")
        return
    }
    self.xmlParser = XMLParser(contentsOf: url)
    self.xmlParser.delegate = self
    let result = self.xmlParser.parse()
    print("parse from file result: \(result)")
    if result == false {
        print(xmlParser.parserError?.localizedDescription)
    }
}

来自应用包的加载错误:

parse from file result: false
Optional("The operation couldn’t be completed. (Cocoa error -1.)")

1 个答案:

答案 0 :(得分:1)

你在说:

guard let urlPath = Bundle.main.path(forResource: fileName, ofType: fileType) else {
    print("Can't load file \(fileName).\(fileType)")
    return
}
guard let url:URL = URL(string: urlPath) else {
    print("Error on create URL to read file")
    return
}

首先,将字符串路径转换为URL非常愚蠢。你知道你想要一个URL,那你为什么不先打电话给url(forResource:...)

其次,如果您 将字符串路径转换为网址,则必须制作file URL