【问题标题】:How to write XML files?如何编写 XML 文件?
【发布时间】:2010-10-03 09:40:07
【问题描述】:

我想在我的应用程序中编写一个不太复杂但很大的文件,并能够通过邮件发送(使用 MFMailComposeViewController) 由于 NSXMLElement 和相关类没有移植到 iPhone SDK,我有哪些选项可以创建 XML 文档? 提前致谢。

【问题讨论】:

标签: iphone xml cocoa-touch xmlwriter


【解决方案1】:

我建议使用KissXML。作者从与您类似的情况开始,并围绕 libxml 创建了一个与 NSXML 兼容的 API 包装器。他在博客上讨论了选项和决定here

【讨论】:

    【解决方案2】:

    无耻的自我推销:KSXMLWriter

    【讨论】:

    • 从您的 URL 中提取:“iOS 支持在项目中会很好。”
    • 它应该可以工作,因为我只使用Foundation;只是还没测试过
    【解决方案3】:

    试试开源XML stream writer for iOS:

    • 用 Objective-C 编写,单个 .h。和 .m 文件
    • 一个@protocol 用于命名空间支持,一个用于不支持

    例子:

    // allocate serializer
    XMLWriter* xmlWriter = [[XMLWriter alloc]init];
    
    // start writing XML elements
    [xmlWriter writeStartElement:@"Root"];
    [xmlWriter writeCharacters:@"Text content for root element"];
    [xmlWriter writeEndElement];
    
    // get the resulting XML string
    NSString* xml = [xmlWriter toString];
    

    这会产生以下 XML 字符串:

    <Root>Text content for root element</Root>
    

    【讨论】:

    • 我不知何故无法评论 John Franklins 的回答,但他的回答是经典的 FAIL,因为它没有 XML 转义。始终在生产代码中使用适当的序列化程序,不要尝试上述方法。
    • 不是把xml数据写入strem文件的方法
    • 它是 XML 事件流,而不是字节流。但是,请参阅 wiki 文档以了解如何连续输出字节。
    【解决方案4】:

    这是一个 NSString 构建的家庭作业。抽象地,创建一个类似的协议:

    @protocol XmlExport
    -(NSString*)xmlElementName;
    -(NSString*)xmlElementData;
    -(NSDictionary*)xmlAttributes;
    -(NSString*)toXML;
    -(NSArray*)xmlSubElements;
    @end
    

    确保您保存的所有内容都实现了它并使用以下内容构建 XML:

    -(NSString*)toXML {
        NSMutableString *xmlString;
        NSString *returnString;
    
        /* Opening tag */
        xmlString = [[NSMutableString alloc] initWithFormat:@"<%@", [self xmlElementName]];
        for (NSString *type in [self xmlAttributes]) {
            [xmlString appendFormat:@" %@=\"%@\"", type, [[self xmlAttributes] valueForKey:type]];
        }   
        [xmlString appendString:@">"];
    
        /* Add subelements */
        for (id<XmlExport> *s in [self xmlSubElements]) {
            [xmlString appendString:[s toXML]];
        }
    
        /* Data */
        if ([self xmlElementData]) {
            [xmlString appendString:[self xmlElementData]];
        }
    
        /* Close it up */
        [xmlString appendFormat:@"</%@>", [self xmlElementName]];
    
        /* Return immutable, free temp memory */
        returnString = [NSString stringWithString:xmlString];
        [xmlString release]; xmlString = nil;
    
        return returnString;
    }
    

    【讨论】:

    • release/nil 行是我的一个习惯,它让我永远不会遇到悬空指针问题。是的,这里没有必要,但是性能成本非常低,优化器很可能会删除它。尽管如此,这仍然是我推荐的一个习惯。
    • 关于 nil'ing 你的变量,见iphonedevelopment.blogspot.com/2010/09/dealloc.html
    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    相关资源
    最近更新 更多