【问题标题】:Read, modify, write xml file in cocoa在 cocoa 中读取、修改、写入 xml 文件
【发布时间】:2011-05-15 19:51:51
【问题描述】:

我正在寻找一个关于如何使用可可读取、修改一个值和编写 xml 文件的简短示例/教程。我发现的所有内容要么发给simple(只是读或写),要么发给complex(作为一个完整的xml 编辑器)。

这似乎是一个非常标准的使用场景,所以我希望那里有一些东西......

【问题讨论】:

标签: objective-c xml cocoa macos


【解决方案1】:

当我声称无法编写此类元素时,我错了。 Apple 有两个 XML 解析器,一个用于 NSDictionary/NSArray/NSString/NSNumber/等。对象和一个称为 NSXMLDocument 的对象。

我删除了之前的代码,它与 Mac OS X 10.3 兼容;下面提到的代码将允许您拥有包含您喜欢的任何标签和属性的 xml 文件。 在我的示例中,代码将创建一个如下所示的 XML 文件:

1

注意:如果您想进一步减少它,您甚至可以删除“counter”并将“root”重命名为“counter”。

新代码兼容 Mac OS X 10.4 及更高版本;它已经过测试并且开箱即用:

- (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];
}

【讨论】:

  • 这个答案对我来说没有任何意义。
  • 我现在重写了我的答案。如果您需要支持 10.4 以下的 Mac OS X,我将不得不再次重写我的答案。这完全取决于您是否有可用的 NSXMLDocument 类。
  • 您是否使用上面的新代码使其工作,或者您仍然遇到问题? ...尝试调用 [self incrementCounter];从 -awakeFromNib 在一个全新的项目中;它应该在您的主目录中生成“myFile”,并在每次运行程序时递增计数器。
【解决方案2】:

这是我对问题的解决方案 - 只是我写出之前读取和解析的文件的部分......

使用 PacMan 的解决方案 - 我遇到了输出 xml 文件格式不正确根本没有换行符)的问题。

另外一点是,我通常更喜欢使用 XPath 在 XML 文档中导航。

我的代码是一个类的一部分,所以每个节点都有一个属性(NSString* cfaLayout 和 NSInteger bitsPerPixel):

-(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;

}

也许对某人有用...

【讨论】:

  • 输出 xml 文件的格式不正确(根本没有换行符):try"NSData *data = [xmlDoc XMLDataWithOptions:NSXMLNodePrettyPrint];"
【解决方案3】:

如果您不熟悉xpaths,那么我建议您阅读它们,xpaths 是一种在 xml 树中查找节点的方法。

【讨论】:

  • 那没有答案,儿子.. 他在问一个特定的问题......并建议他“阅读”xpaths 只是粗鲁。我同意 OP... 就个人而言,我可以找到一百万种在可可中读取 XML 的方法,但对于我的一生来说,无法找到一个单一的、显而易见的 在 XML“对象”中转换 NSArray 或 NSDictionary 等的方法 - 终生难忘!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 2023-02-18
相关资源
最近更新 更多