我在 Objective-C 的 NSString 对象中有一个 XML 文档。
XML 是从 Web 服务获取的,它没有任何格式、换行符或缩进。
谁能告诉我生成一个新的 NSString 对象的最简单方法,它的 XML 格式很好,每个元素都在一个新的行上,并带有适当的缩进等?
我在 Objective-C 的 NSString 对象中有一个 XML 文档。
XML 是从 Web 服务获取的,它没有任何格式、换行符或缩进。
谁能告诉我生成一个新的 NSString 对象的最简单方法,它的 XML 格式很好,每个元素都在一个新的行上,并带有适当的缩进等?
好的,所以我自己解决了这个问题。
这使用 Google 的 GData XML 解析包装器围绕内置/usr/include/libxml2
XML 库,将NSString
包含的未格式化 XML 转换为另一个NSString
格式良好、带有缩进和换行符的 XML。
注意这是基于Xcode 5,目标是iOS 7;尽管它也可能适用于其他目标。
步骤 1. 将 GData 类(源)复制到项目中
将GData 库中的2 个源文件GDataXMLNode.h
和直接复制到项目中。GDataXMLNode.m
步骤 2. 将 libxml2 添加到搜索路径
在 Project -> Build Settings -> Search Paths -> Header Search Paths 中,添加路径:/usr/include/libxml2
在项目 -> 构建设置 -> 链接 -> 其他链接器标志中,添加标志:-lxml2
第 3 步:如果您的应用使用 ARC,请为 GData 类禁用 ARC
在 Targets -> Build Phases -> Compile Sources ->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 字符串转换为格式良好的字符串。
如果您不想在项目中包含 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;
}
它改编自 GDatainit
和XMLString
方法,剥离错误检查以保持简短。请记住根据需要包含它们。
这样,您只需将 libxml2 包含到您的搜索路径中(这是上一个答案中的第 2 步)并#import <libxml/tree.h>
在 Objective-C 中格式化 XML。