iOS - XML Pretty Print

早过忘川 提交于 2020-01-02 02:41:07

问题


I am using GDataXML in my iOS application and want a simple way to format and print an XML string - "pretty print"

Does anyone know of an algorithm in Objective C, or one that works in another language I can translate?


回答1:


I've used HTML Tidy (http://tidy.sourceforge.net/) for things like this. It's a C library so can be linked in to and called from an Objective C runtime fairly easily as long as you're comfortable with C. The C++ API is callable from Objective C++ so that might be easier to use if you're comfortable with Objective C++.

I've not used the C or C++ bindings; I did it via Ruby or Python but it's all the same lib. It will read straight XML (as well as potentially dirty HTML) and it has both simple and pretty print options.




回答2:


You can modify the source code of GDataXMLNode direcly:

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

Alternative:

As I didn't want to modify the library directly (for maintenance reasons), I wrote that category to extend the class from outside:

GDataXMLNode+PrettyFormatter.h:

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

- (NSString *)XMLStringFormatted;

@end

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


来源:https://stackoverflow.com/questions/6403083/ios-xml-pretty-print

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!