【问题标题】:iOS cannot parse KML / XML downloaded from serveriOS 无法解析从服务器下载的 KML / XML
【发布时间】:2015-07-02 08:58:46
【问题描述】:

我在项目中包含的 KML 文件可以正确解析,而从服务器下载的同一个文件却不能正确解析?!

我修改了Apple's KML parsing example 以解析 KML 文件。如果我将 KML 文件直接添加到 Xcode 项目中,它会正确解析并按预期在地图上显示它的折线、注释等。但是,如果我从我的服务器下载相同的 KML 文件,将其保存到磁盘并尝试解析它,则解析不起作用。即解析器在文件中找不到任何要解析的元素,因此地图上没有显示任何内容!

首先,我已验证文件已正确下载并保存到磁盘。我检查了模拟器的数据(SimPholders 是一个方便的工具)以获取文件并将其与原始文件进行比较以防损坏,那里没有问题,它可以正确下载并保存,没有损坏。

接下来,我检查了我传递给 KML 解析器的文件的 URL,以确保它是正确的并且没问题。我使用 NSFileManager fileExistsAtPath 来确定这一点,KML 文件位于我提供给解析器的路径中。

在地图视图控制器的 viewDidLoad 方法中,我从服务器下载文件并将其传递给解析器。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[KmlDownloader sharedKmlDownloader] downloadFileFrom:@"http://www.myserver.com/file.kml" isAsyncDownload:NO];
    NSURL *kmlUrl = [[KmlDownloader sharedKmlDownloader] urlForKmlFile];

    if (kmlUrl)
    {
        kmlParser = [[KMLParser alloc] initWithURL:kmlUrl];
        [kmlParser parseKML];
    }



    // Add all of the MKOverlay objects parsed from the KML file to the map.
    NSArray *overlays = [kmlParser overlays];
    [map addOverlays:overlays];

    // Add all of the MKAnnotation objects parsed from the KML file to the map.
    NSArray *annotations = [kmlParser points];
    [map addAnnotations:annotations];

    // Some positioning code of the view port here
}

KmlDownloader 作为参考可以在 Gist here 中找到。抱歉,格式太乱了,无法包含内联,但它是一个相对较小的文件。

任何想法为什么会发生这种情况?非常感谢。

【问题讨论】:

    标签: ios objective-c xml parsing kml


    【解决方案1】:

    好的,找到了问题。这与我下载后访问文件的方式有关。保存到磁盘后,我会将其 URL 发送到解析器。问题是我使用了不正确的 NSURL 方法,我最初使用的是:

    NSURL *fileUrl = [NSURL URLWithString:[self pathForFile:self.pathToKmlFileOnDisk]];
    

    而我应该一直在使用:

    NSURL *fileUrl = [[NSURL alloc] initFileURLWithPath:self.pathToKmlFileOnDisk];
    

    两者是相同的 URL,但第二个包含 "file:///" 前缀。一旦更改,解析器将按预期进行解析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      相关资源
      最近更新 更多