1

当我从 Internet 获取 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(); 似乎以不同的方式显示它。显然本地文件与互联网上的文件相同。

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

4

1 回答 1

0

几点观察:

  1. 关键问题似乎是您检索了 中的数据rspData,但是当您将其写入临时文件时,您正在写入data,而不是rspData. 所以改变上面写着的那一行:

    [data writeToFile:path atomically:YES];
    

    [rspData writeToFile:path atomically:YES];
    

    坦率地说,我什至没有看到data那个时候定义的变量(你有一些 ivar 挥之不去吗?)。我会毫不留情地删除任何您不需要的 ivars 或其他变量,以免您不小心引用了一些未使用的变量。无论如何,只需使用rspData您检索到的而不是其他变量。

  2. 为什么您甚至将其写入文件,然后才将文件读入另一个NSData您传递给 XML 解析器的文件?这似乎完全没有必要。继续使用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 提供了有用的错误消息,因此您应该利用这些消息。

于 2013-08-13T17:34:03.700 回答