npg*_*all 3 xml objective-c ios
我在Objective-C中的NSString对象中有一个XML文档.
XML是从Web服务获取的,它没有任何格式,换行符或缩进.
任何人都可以告诉我最简单的方法来生成一个新的NSString对象,它具有良好的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;
}
Run Code Online (Sandbox Code Playgroud)
它适用于GData init和XMLString方法,剥离错误检查以保持简短.请记住根据需要包含它们.
这样您只需将libxml2包含在搜索路径中(这是上一个答案中的第2步),并#import <libxml/tree.h>在Objective-C中格式化XML.
好的,所以我自己解决了这个问题.
这使用围绕内置/usr/include/libxml2XML库的Google GData XML解析包装器,将NSString包含未格式化的XML 转换为另一个NSString格式良好的缩进和换行符.
请注意,这是基于Xcode 5,目标是iOS 7; 虽然它也适用于其他目标.
步骤1.将GData类(源)复制到项目中
将2个源文件复制,GDataXMLNode.h并GDataXMLNode.m从GData库直接复制到项目中.
步骤2.将libxml2添加到搜索路径
在项目 - >构建设置 - >搜索路径 - >标题搜索路径中,添加路径: /usr/include/libxml2
在项目 - >构建设置 - >链接 - >其他链接器标志中,添加标志: -lxml2
步骤3.如果您的应用使用ARC,请为GData类禁用ARC
在Targets - > Build Phases - > Compile Sources - >中GDataXMLNode.m,添加Compiler Flag:-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;
}
Run Code Online (Sandbox Code Playgroud)
就是这样,这个方法将原始XML字符串转换为格式良好的字符串.