0

从 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 ];

这工作正常,并且 book.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。

您的回答将不胜感激。

谢谢,陶西夫。

4

1 回答 1

1

file://strValue. 请参阅NSURL类文档...如果您不想file://手动添加前缀,则应使用fileURLWithPath:isDirectory:.

为什么这一切?

对您的情况的简化解释 - 每个 URL 都包含方案/协议(http、文件、https、...)、分隔符(://)和路径(~/Desktop/...)。它是强制性的,而不是可选的。当您使用URLWithString:它时,它期望您的字符串是完整的 URL,而不仅仅是它的一部分(在您的情况下缺少方案/协议)。

因此,如果您确实想使用 URL 而不是文件路径,则必须注意file://(何时URLWithString:使用)或使用fileURLWithPath:isDirectory:可以仅传递文件路径的地方。

您这样做,但只是警告其他人,如果您的路径确实包含波浪号 (~),您必须先扩展它。

于 2012-10-14T10:51:30.227 回答