解析本地XML文件工作,下载的XML文件不

时间:2013-08-13 17:07:37

标签: iphone ios objective-c

当我从互联网上获取XML文件然后解析它时出现此问题,我收到此错误:

  

Error while parsing the document: Error Domain=SMXMLDocumentErrorDomain Code=1 "Malformed XML document. Error at line 1:1." UserInfo=0x886e880 {LineNumber=1, ColumnNumber=1, NSLocalizedDescription=Malformed XML document. Error at line 1:1., NSUnderlyingError=0x886e7c0 "The operation couldn’t be completed. (NSXMLParserErrorDomain error 5.)"}

以下是代码摘录(我相信我只展示了最相关的代码,如果您需要更多代码,请询问。)

// Create a URL Request and set the URL
NSURL *url = [NSURL URLWithString:@"http://***.xml"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// Display the network activity indicator
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

// Perform the request on a new thread so we don't block the UI
dispatch_queue_t downloadQueue = dispatch_queue_create("Download queue", NULL);
dispatch_async(downloadQueue, ^{

    NSError* err = nil;
    NSHTTPURLResponse* rsp = nil;

    // Perform the request synchronously on this thread
    NSData *rspData = [NSURLConnection sendSynchronousRequest:request returningResponse:&rsp error:&err];

    // Once a response is received, handle it on the main thread in case we do any UI updates
    dispatch_async(dispatch_get_main_queue(), ^{
        // Hide the network activity indicator
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

        if (rspData == nil || (err != nil && [err code] != noErr)) {
            // If there was a no data received, or an error...
            NSLog(@"No data received.");
        } else {
            // Cache the file in the cache directory
            NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
            NSString* path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"init.xml"];

            //NSLog(@"%@",path);
            [[NSFileManager defaultManager] removeItemAtPath:path error:nil];

            [data writeToFile:path atomically:YES];

            //NSString *sampleXML = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"xml"];


            NSData *data = [NSData dataWithContentsOfFile:path];

            // create a new SMXMLDocument with the contents of sample.xml
            NSError *error;
            SMXMLDocument *document = [SMXMLDocument documentWithData:data error:&error];

            // check for errors
            if (error) {
                NSLog(@"Error while parsing the document: %@", error);
                // return;

            }

首先,我已将iPhone连接到已提取的XML提要并写入可变路径的路径。然后我检查XML文档中的错误,每次都得到错误。

但是,如果我使用我放在应用程序主文件夹中的本地XML文件,则获取所有数据都没有问题。

使用代码:

NSString *sampleXML = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"xml"];

那么有没有人知道我做错了什么?似乎它不会将XML文件下载并存储到iPhone的缓存中,但NSLog();似乎以不同的方式显示它。显然,本地文件与互联网上的文件相同。

此外,我已经尝试将文件保存到路径中,但没有任何结果。

1 个答案:

答案 0 :(得分:0)

有几点意见:

  1. 关键问题似乎是您在rspData中检索了数据,但是当您将其写入临时文件时,您正在编写data,而不是rspData }。因此,改变说:

    的行
    [data writeToFile:path atomically:YES];
    

    [rspData writeToFile:path atomically:YES];
    

    坦率地说,我甚至没有看到那时定义的data变量(你有一些挥之不去的东西?)。我会无法摆脱任何你不需要的ivars或其他变量,这样你就不会意外地引用一些未使用的变量。无论如何,只需使用您检索的rspData而不是其他变量。

  2. 为什么你甚至将它写入文件,然后将文件读入你传递给XML解析器的另一个NSData?这似乎完全没必要。请继续使用您最初检索到的rspData。如果要将NSData保存到文件中以便以后检查它以进行调试,那很好。但是,从文件中重新检索NSData是没有意义的,因为您已经在rspData已经拥有它了。

  3. 如果您将来遇到这些错误,请随意使用调试代码行检查NSData变量的内容,例如:

    NSLog(@"rspData = %@", [[NSString alloc] initWithData:rspData encoding:NSUTF8StringEncoding]);
    

    当你这样做时,你可以查看NSData的字符串再现,通常问题会变得不明显。

  4. 完全不同,在调试错误处理程序中,您有一行说:

    NSLog(@"No data received.");
    

    我可能会建议您始终包含可能提供的任何错误,例如:

    NSLog(@"No data received: error = %@", err);
    

    iOS提供有用的错误消息,因此您应该利用这些消息。