来自Objective-C中的NSString的漂亮打印XML

时间:2013-11-08 10:42:49

标签: ios objective-c xml

我在Objective-C中的NSString对象中有一个XML文档。

XML是从Web服务获取的,它没有任何格式,换行符或缩进。

有人能告诉我最简单的方法来生成一个新的NSString对象,它具有很好的XML格式,每个元素都在一个新的行上有适当的缩进等吗?

2 个答案:

答案 0 :(得分:8)

如果您不想在项目中包含GData,请使用以下方法:

+ (NSString *)prettyPrintXML:(NSString *)rawXML {
    const char *utf8Str = [rawXML UTF8String];
    xmlDocPtr doc = xmlReadMemory(utf8Str, (int)strlen(utf8Str), NULL, NULL, XML_PARSE_NOCDATA | XML_PARSE_NOBLANKS);
    xmlNodePtr root = xmlDocGetRootElement(doc);
    xmlNodePtr xmlNode = xmlCopyNode(root, 1);
    xmlFreeDoc(doc);

    NSString *str = nil;

    xmlBufferPtr buff = xmlBufferCreate();
    doc = NULL;
    int level = 0;
    int format = 1;

    int result = xmlNodeDump(buff, doc, xmlNode, level, format);

    if (result > -1) {
        str = [[NSString alloc] initWithBytes:(xmlBufferContent(buff))
                                       length:(NSUInteger)(xmlBufferLength(buff))
                                     encoding:NSUTF8StringEncoding];
    }
    xmlBufferFree(buff);

    NSCharacterSet *ws = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    NSString *trimmed = [str stringByTrimmingCharactersInSet:ws];
    return trimmed;
}

它适用于GData的initXMLString方法,剥离错误检查以保持简短。请记住根据需要加入它们。

这样您只需将libxml2包含在搜索路径中(前一个答案中的第2步)和#import <libxml/tree.h>以在Objective-C中格式化XML。

答案 1 :(得分:7)

好的,所以我自己解决了这个问题。

这使用了围绕内置/usr/include/libxml2 XML库的Google GData XML解析包装器,将包含无格式XML的NSString转换为另一个格式正确的NSString,并带有缩进和换行。

注意这是基于Xcode 5,目标是iOS 7;虽然它也可能适用于其他目标。


步骤1.将GData类(源)复制到项目中

GData library中的2个源文件GDataXMLNode.hGDataXMLNode.m直接复制到项目中。


步骤2.将libxml2添加到搜索路径

在项目中 - &gt;构建设置 - &gt;搜索路径 - &gt;标题搜索路径,添加路径:/usr/include/libxml2

在项目中 - &gt;构建设置 - &gt;链接 - &gt;其他链接器标志,添加标志:-lxml2


步骤3.如果您的应用使用ARC,请为GData类禁用ARC

目标 - &gt;构建阶段 - &gt;编译源 - &gt; GDataXMLNode.m,添加编译器标记:-fno-objc-arc

此时,请确保您的项目已构建。如果是,则正确配置GData。


步骤4.编辑GDataXMLNode.m以使其默认为打印XML

打开GDataXMLNode.m,找到方法- (NSString *)XMLString

更改:int format = 0;

收件人:int format = 1;


步骤5.在项目的任何位置添加以下方法

#import "GDataXMLNode.h"

+ (NSString *)prettyPrintXML:(NSString *)rawXML {
    NSError *error;
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithXMLString:rawXML options:0 error:&error];
    return error ? rawXML : doc.rootElement.XMLString;
}

就是这样,这个方法会将原始XML字符串转换为格式良好的字符串。