Objective c 在cocoa中读取、修改、写入xml文件
我正在寻找一个关于如何使用cocoa读取、修改一个值和编写xml文件的简短示例/教程。我找到的所有内容都是(读或写)或(作为一个完整的xml编辑器)Objective c 在cocoa中读取、修改、写入xml文件,objective-c,xml,cocoa,macos,Objective C,Xml,Cocoa,Macos,我正在寻找一个关于如何使用cocoa读取、修改一个值和编写xml文件的简短示例/教程。我找到的所有内容都是(读或写)或(作为一个完整的xml编辑器) 这似乎是一个非常标准的使用场景,所以我希望有一些东西…如果您不熟悉s,那么我建议您仔细阅读它们,s是在xml树中查找节点的一种方法 当我声称无法编写这样的元素时,我错了。 Apple有两个XML解析器,一个用于NSDictionary/NSArray/NSString/NSNumber/等对象,另一个称为NSXMLDocument 我已经删除了以前
这似乎是一个非常标准的使用场景,所以我希望有一些东西…如果您不熟悉s,那么我建议您仔细阅读它们,s是在xml树中查找节点的一种方法 当我声称无法编写这样的元素时,我错了。 Apple有两个XML解析器,一个用于NSDictionary/NSArray/NSString/NSNumber/等对象,另一个称为NSXMLDocument 我已经删除了以前的代码,它与Mac OS X 10.3兼容;下面提到的代码将允许您拥有包含您喜欢的任何标记和属性的xml文件。 在我的示例中,代码将创建如下所示的XML文件: 一, 注意:如果您想进一步减少“计数器”,甚至可以删除“计数器”并将“根”重命名为“计数器” 新代码兼容Mac OS X 10.4和forward;它经过测试,可以开箱即用:
- (void)incrementCounter
{
NSXMLDocument *xmlDoc;
NSError *error;
NSURL *url;
NSXMLElement *root;
id item;
NSData *data;
NSArray *children;
int counter;
NSString *pathname;
pathname = [@"~/myFile" stringByExpandingTildeInPath];
url = [NSURL fileURLWithPath:pathname];
xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:url options:NSXMLDocumentTidyXML error:&error];
if(xmlDoc)
{
root = [xmlDoc rootElement];
}
else
{
root = [NSXMLNode elementWithName:@"root"];
xmlDoc = [[NSXMLDocument alloc] initWithRootElement:root];
}
// fetch value:
children = [root nodesForXPath:@"counter" error:&error];
item = [children count] ? [children objectAtIndex:0] : NULL;
// modify value:
counter = item ? [[item stringValue] intValue] : 0;
counter++;
if(NULL == item)
{
item = [NSXMLNode elementWithName:@"counter" stringValue:@"0"];
[root insertChild:item atIndex:0];
}
[item setStringValue:[[NSNumber numberWithInt:counter] stringValue]];
// write:
data = [xmlDoc XMLData];
[data writeToURL:url atomically:YES];
}
这是我解决这个问题的方法-只有我写下之前读取和解析的文件的部分 使用PacMan的解决方案——我遇到了输出xml文件格式不正确的问题(根本没有换行符) 另一点是,我通常更喜欢使用XPath浏览XML文档 我的代码是类的一部分,因此每个节点都有一个属性(NSString*cfaLayout和NSInteger bitsPerPixel): }
可能对某些人有用…可能与以下内容重复:| | |谢谢,但我正在寻找一个示例,演示如何读取、修改和编写xml树。“复制品”不会这样做。假设我在一个xml文件中有一个简单的计数器:1。如何解析、递增并将其写回文件??那不是答案,孩子。。他在问一个特别的问题。。。建议他“阅读”XPath是不礼貌的。我同意这个观点。。。就我个人而言,我可以找到一百万种方法来读取cocoa中的XML,但就我个人而言,我找不到一种简单、明显的方法来转换XML“对象”中的NSArray、or和NSDictionary等!这个答案对我来说毫无意义。我现在重写了我的答案。如果你需要支持10.4以下的MacOSX,我必须再次重写我的答案。这完全取决于您是否有可用的NSXMLDocument类。您是使用上面的新代码获得它的,还是仍然有问题。。。尝试调用[自增计数器];from-awakeFromNib在一个全新的项目中;它应该在主目录中生成“myFile”,并在每次运行程序时递增计数器。
-(BOOL) savePropertiesFile{
BOOL isSuccess=FALSE;
NSError* error;
NSXMLElement* currentElement;
NSArray* nodes;
/* parse existing url file before saving it to new url */
if([_documentUrl checkResourceIsReachableAndReturnError:&error]==YES){
self.document=[[NSXMLDocument alloc]
initWithContentsOfURL:_documentUrl
options:0
error:&error];
/* check top node */
nodes=[_document nodesForXPath:@"/ImageFormat-Properties"
error:&error];
if([nodes count]==0){
return FALSE;
}
/* cfa layout */
nodes=[_document nodesForXPath:@"/ImageFormat-Properties/ImageFormatDetails/CFALayout[text()]"
error:&error];
if([nodes count]>0){
currentElement=[nodes objectAtIndex:0];
[currentElement setStringValue:[_cfaLayout lowercaseString]];
}
else{
return FALSE;
}
/* bitsPerPixel */
nodes=[_document nodesForXPath:@"/ImageFormat-Properties/ImageFormatDetails/BitsPerPixel[text()]"
error:&error];
if([nodes count]>0){
currentElement=[nodes objectAtIndex:0];
[currentElement setStringValue:[NSString stringWithFormat: @"%ld", (long)_bitsPerPixel]];
}
else{
return FALSE;
}
}
[_document setDocumentContentKind:NSXMLDocumentXMLKind];
[_document setCharacterEncoding:@"UTF-8"];
[_document validateAndReturnError:&error];
if(error){
return FALSE;
}
[self setDocumentUrl:_documentSaveAsUrl];
NSData* xmlData=[_document XMLDataWithOptions:NSXMLNodePrettyPrint];
isSuccess=[xmlData writeToURL:_documentSaveAsUrl atomically:YES];
return isSuccess;