Ios 在Objective-C中从NSString漂亮地打印XML

Ios 在Objective-C中从NSString漂亮地打印XML,ios,objective-c,xml,Ios,Objective C,Xml,我在Objective-C中的NSString对象中有一个XML文档 XML是从web服务获得的,它没有任何格式、换行符或缩进 有谁能告诉我生成一个新的NSString对象的最简单的方法吗?它的XML格式很好,每个元素都在新行上,并带有适当的缩进等?好的,所以我自己解决了这个问题 这使用Google的GData XML解析包装器,围绕内置的/usr/include/libxml2XML库,将包含未格式化XML的NSString转换为另一个NSString,该文件格式良好,带有缩进和换行符 注意这

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

XML是从web服务获得的,它没有任何格式、换行符或缩进


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

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

这使用Google的GData XML解析包装器,围绕内置的
/usr/include/libxml2
XML库,将包含未格式化XML的
NSString
转换为另一个
NSString
,该文件格式良好,带有缩进和换行符

注意这是基于Xcode 5的,目标是iOS 7;尽管它可能也适用于其他目标


第1步。将GData类(源)复制到项目中

将两个源文件,
GDataXMLNode.h
GDataXMLNode.m
从直接复制到项目中


第2步。将libxml2添加到搜索路径

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

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


第3步。如果您的应用程序使用ARC,请为GData类禁用ARC

在目标->构建阶段->编译源->
GDataXMLNode.m
中,添加编译器标志:
-fno objc arc

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


第4步。编辑
GDataXMLNode.m
,使其在默认情况下非常适合打印XML

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

更改:
int格式=0

至:
int格式=1


第5步。在项目中的任意位置添加以下方法

#导入“GDataXMLNode.h”



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

如果您不想在项目中包含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的
init
XMLString
方法改编而来的,剥离错误检查以保持简短。请记住根据需要包括它们


这样,您只需将libxml2包含到搜索路径中(这是前面答案中的第2步)和
#import
即可在Objective-C中格式化XML。

您需要将XML解析为DOM并“打印”该DOM。感谢您的回答!代码现在正在生产中,但我下次一定会尝试这种方法。
+ (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;
}