【问题标题】:Best way to write arbitrary NSData into an NSXMLElement将任意 NSData 写入 NSXMLElement 的最佳方法
【发布时间】:2012-04-27 21:33:31
【问题描述】:

我允许将应用程序数据(它是 10.7 上的 Mac 应用程序)导出为 XML 文件,我希望能够从 XML 导出/导入/从 XML 导出/导入的字段是 NSData 字段。这样做的正确/可接受的方式是什么?我应该convert to base64 并将该字符串写入 XML 吗?

我不希望像链接问题的公认答案那样使用类别推出自己的解决方案(链接到Matt Gallagher's solution)。

更新

我刚刚发现了NSPropertyListSerialization 类。我抱有希望,但它只有返回 NSData 表示形式的静态序列化方法。

【问题讨论】:

  • 我会避免在 XML (NSData) 中添加原始数据。如果可能的话,我会用原始数据编写另一个文件并将其 URL 添加到 XML 字段。如果这不是一个选项,我会转换为字符串,小心避免像 '>' , '
  • @Mircea 我明白你的意思,但在这种情况下 XML 格式是有意义的。对于表示的实体,二进制字段只是众多字段中的一个,文件中可能有数百个或更多的实体。我更喜欢单个文件的简单性和用户可编辑的特性,而不是创建某种包。
  • 您需要特定格式的 XML,还是标准的 Mac OS X 属性列表格式需要?它是纯 XML。
  • @RobKeniger 我正在调查它。我不确定我是否对 plist XML 如何作为节点嵌入到更大的 XML 文档中感到满意——它只是部分转义。 < 变为 <>" 保持原样

标签: objective-c xml cocoa xml-serialization base64


【解决方案1】:

我意识到(正如我的更新所暗示的那样)我可以使用 NSPropertyListSerialization 类,因为 -dataWithPropertyList:format:options:error: 返回的 NSData 只是一个 UTF-8 字符串。这是我用来序列化的:

NSData *data = value;

NSError *error = nil;
NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:data
                                                               format:NSPropertyListXMLFormat_v1_0
                                                              options:0
                                                                error:&error];
if (error) {
    NSLog(@"Error serializing data to plist XML: %@", error);
} else {
    NSString *plistString = [[NSString alloc] initWithData:plistData encoding:NSUTF8StringEncoding];
    NSXMLElement *dataElement = [NSXMLElement elementWithName:field
                                                  stringValue:plistString];
}

并反序列化:

NSData *plistData = [element.stringValue dataUsingEncoding:NSUTF8StringEncoding];
NSData *originalData = [NSPropertyListSerialization propertyListWithData:plistData
                                                                 options:NSPropertyListImmutable
                                                                  format:NULL
                                                                   error:&error];

if (error) {
    NSLog(@"Error deserializing data from plist XML: %@", error);
} else {
    value = originalData;
}

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2011-05-16
    • 2011-03-01
    • 2021-09-08
    • 2012-10-22
    • 2011-03-20
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多