为了从Cocoa xml读写编码开始,我创建了一个示例应用程序,我可以在其中写入XML文件,但在读取时出现一些错误。下面是代码。
NSXMLElement * root = [[NSXMLElement alloc ] initWithName:@"Book"]
NSXMLDocument * xmlDoc = [[NSXMLDocument alloc ] initWithRootElement: root ];
[root addChild:[NSXMLElement elementWithName: @"Name" stringValue:@"book name"]];
[root addChild:[NSXMLElement elementWithName:@"Author" stringValue:@"bool author"]];
NSData * xmlData = [xmlDoc XMLDataWithOptions:NSXMLNodePrettyPrint];
[xmlData writeToFile:[@"~/Desktop/book.xml" stringByExpandingTildeInPath ]
atomically:YES];
[xmlDoc release ];
这工作正常,并且创建了书.xml。但是当尝试读取此文件时,我在打开此文件时遇到了问题。这是代码。
NSString *strValue = [@"~/Desktop/book.xml" stringByExpandingTildeInPath];
NSURL * strUrl = [NSURL URLWithString:strValue];
NSError * err = nil;
NSXMLDocument * xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:strUrl
options:NSXMLDocumentTidyXML error:&err];
NSXMLNode * rootNode = [xmlDoc rootElement ];
[xmlDoc release ];
xmlDoc 的值为 nil。
您的回答将不胜感激。
谢谢陶西夫。
你在strValue
中缺少file://
。请参阅NSURL
类文档...如果您不想手动弄乱前缀file://
,则应使用 fileURLWithPath:isDirectory:
.
为什么会这样?
简化您的情况解释 - 每个 URL 都由方案/协议(http、file、https、...)、分隔符 (://) 和路径 (~/Desktop/...) 组成。这是强制性的,而不是可选的。当您使用URLWithString:
时,它期望您的字符串是完整的 URL,而不仅仅是其中的一部分(在您的情况下缺少方案/协议)。
因此,如果您确实想使用 URL 而不是文件路径,则必须注意file://
(使用 URLWithString:
时)或使用可以只传递文件路径的fileURLWithPath:isDirectory:
。
你这样做,但只是警告其他人,如果你的路径确实包含波浪号 (~),你必须先展开它。