iOS - XML Pretty Print

ada*_*dam 7 xml objective-c ios gdataxml

我在iOS应用程序中使用GDataXML,想要一种简单的方法来格式化和打印XML字符串 - "漂亮的打印"

有没有人知道Objective C中的算法,或者我能翻译的另一种语言?

小智 13

您可以直接修改GDataXMLNode的源代码:

- (NSString *)XMLString {
   ...
   // enable formatting (pretty print / beautifier)
   int format = 1; // changed from 0 to 1
   ...
}
Run Code Online (Sandbox Code Playgroud)

替代方案:

由于我不想直接修改库(出于维护原因),我编写了该类来从外部扩展类:

GDataXMLNode + PrettyFormatter.h:

#import "GDataXMLNode.h"
@interface GDataXMLNode (PrettyFormatter)

- (NSString *)XMLStringFormatted;

@end
Run Code Online (Sandbox Code Playgroud)

GDataXMLNode + PrettyFormatter.m:

#import "GDataXMLNode+PrettyFormatter.h"

@implementation GDataXMLNode (PrettyFormatter)

- (NSString *)XMLStringFormatted {

    NSString *str = nil;

    if (xmlNode_ != NULL) {

        xmlBufferPtr buff = xmlBufferCreate();
        if (buff) {

            xmlDocPtr doc = NULL;
            int level = 0;
            // enable formatting (pretty print / beautifier)
            int format = 1;

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

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

    // remove leading and trailing whitespace
    NSCharacterSet *ws = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    NSString *trimmed = [str stringByTrimmingCharactersInSet:ws];
    return trimmed;
}

@end
Run Code Online (Sandbox Code Playgroud)


smp*_*kes 1

我已经使用 HTML Tidy (http://tidy.sourceforge.net/) 来完成类似的事情。它是一个 C 库,因此只要您熟悉 C,就可以相当轻松地链接到 Objective C 运行时并从中调用。C++ API 可以从 Objective C++ 调用,因此如果您熟悉 C++,可能会更容易使用目标C++。

我没有使用过 C 或 C++ 绑定;我通过 Ruby 或 Python 完成了它,但它们都是相同的库。它将直接读取 XML(以及可能不干净的 HTML),并且具有简单且漂亮的打印选项。