【问题标题】:XML Parsing - NSXMLParserErrorDomain error 5XML 解析 - NSXMLParserErrorDomain 错误 5
【发布时间】:2011-03-30 12:14:52
【问题描述】:

我正在尝试解析 XML 文件。效果很好 - 直到今天...

下面是我开始解析 XML 的方法:

NSString *link = [[NSString alloc] init];
link = @"link_to_xml_file";

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:link] 
                                             cachePolicy:NSURLRequestReturnCacheDataElseLoad 
                                         timeoutInterval:30.0];

connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

以下是我如何使用接收到的数据:

- (void)connection:(NSURLConnection *)theConnection 
    didReceiveData:(NSData *)incrementalData 
{
    if (data == nil)
        data = [[NSMutableData alloc] init];

    [data appendData:incrementalData];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",actual]];

    NSError *parseError = nil;
    NSDictionary *xmlDictionary = [XMLReader dictionaryForXMLString:[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] error:&parseError];

    if (parseError != nil) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:[parseError localizedDescription] delegate:nil cancelButtonTitle:@"Zurück" otherButtonTitles:nil];
        [alert show];
        [alert release];
    } //shows an alertview with NSXMLParserErrorDomain error 5

    NSLog(@"String: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); //returns null

    NSLog(@"Dictionary: %@",xmlDictionary); //returns null

    NSMutableDictionary *tempDictForAddDate = [[NSMutableDictionary alloc] initWithDictionary:xmlDictionary];

    NSDateFormatter *originalDate = [[NSDateFormatter alloc] init];
    [originalDate setDateFormat:@"dd.MM.yyyy"];

    NSString *today = [originalDate stringFromDate:[NSDate date]];

    [tempDictForAddDate setObject:today forKey:@"updated"];

    [tempDictForAddDate writeToFile:filePath atomically:YES];

    self.contentList = [[tempDictForAddDate objectForKey:@"xmlObject"] objectForKey:@"event"];

    [self sortContent];
}

XML 文件在我的浏览器中工作。每个标签都是封闭的。没有任何错误,但我从来没有得到文件的数据。

希望有人能帮忙。

mavrick3.

【问题讨论】:

    标签: iphone objective-c nsxmlparser nsxmlparsererrordomain


    【解决方案1】:

    您(明智地)使用异步 url 连接,但这意味着您的 didReceiveData 委托将在数据进入时被多次调用,因此在您解析它时它不会完整。

    您可能希望将解析移到以下委托方法中。

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    

    见Apple's Documentation here

    编辑:

    正式验证您的 XML 总是一个好主意 - 我倾向于使用 w3c 工具http://www.w3schools.com/xml/xml_validator.asp

    另外,当过去可以工作的东西停止工作时,我总是问自己发生了什么变化?文件不一样吗?它更大吗?您确定它存在于服务器上并且您的浏览器没有使用缓存版本吗?

    【讨论】:

    • 但它一直工作到今天......我将解析代码投入到 connectionDidFinishLoading: 中,但它仍然无法正常工作。当然,我没有更改任何代码,只是执行了命令.. 我该怎么办?
    • 好的,所以我猜它只是因为文件的大小小于第一次发送的数据量。把它移到正确的地方还是不错的。我再想想……
    • 之所以称为增量数据是有原因的。直到今天,您的反应可能更小。每次调用 - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData 时,您都需要将该增量数据附加到 NSMutableData 对象。剩下的代码只需要移动到- (void)connectionDidFinishLoading:(NSURLConnection *)connection
    • 我找到了解决方案——编码问题。谢谢你。我会接受你的回答;-)
    猜你喜欢
    • 2011-09-29
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多