当我从互联网上获取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();似乎以不同的方式显示它。显然,本地文件与互联网上的文件相同。
此外,我已经尝试将文件保存到路径中,但没有任何结果。
答案 0 :(得分:0)
有几点意见:
关键问题似乎是您在rspData
中检索了数据,但是当您将其写入临时文件时,您正在编写data
,而不是rspData
}。因此,改变说:
[data writeToFile:path atomically:YES];
到
[rspData writeToFile:path atomically:YES];
坦率地说,我甚至没有看到那时定义的data
变量(你有一些挥之不去的东西?)。我会无法摆脱任何你不需要的ivars或其他变量,这样你就不会意外地引用一些未使用的变量。无论如何,只需使用您检索的rspData
而不是其他变量。
为什么你甚至将它写入文件,然后将文件读入你传递给XML解析器的另一个NSData
?这似乎完全没必要。请继续使用您最初检索到的rspData
。如果要将NSData
保存到文件中以便以后检查它以进行调试,那很好。但是,从文件中重新检索NSData
是没有意义的,因为您已经在rspData
已经拥有它了。
如果您将来遇到这些错误,请随意使用调试代码行检查NSData
变量的内容,例如:
NSLog(@"rspData = %@", [[NSString alloc] initWithData:rspData encoding:NSUTF8StringEncoding]);
当你这样做时,你可以查看NSData
的字符串再现,通常问题会变得不明显。
完全不同,在调试错误处理程序中,您有一行说:
NSLog(@"No data received.");
我可能会建议您始终包含可能提供的任何错误,例如:
NSLog(@"No data received: error = %@", err);
iOS提供有用的错误消息,因此您应该利用这些消息。