iOS - XML ​​Pretty Print - PullRequest
       8

iOS - XML ​​Pretty Print

7 голосов
/ 19 июня 2011

Я использую GDataXML в своем приложении для iOS и хочу простой способ форматирования и печати строки XML - "pretty print"

Кто-нибудь знает алгоритм в Objective C или тот, который работает на другом языке, который я могу перевести?

Ответы [ 2 ]

13 голосов
/ 21 декабря 2011

Вы можете изменить исходный код GDataXMLNode напрямую:

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

Альтернатива:

Поскольку я не хотел напрямую изменять библиотеку (по причинам обслуживания), я написал эту категорию для расширения класса извне:

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
1 голос
/ 19 июня 2011

Я использовал HTML Tidy (http://tidy.sourceforge.net/) для подобных вещей. Это библиотека C, поэтому ее можно легко связывать и вызывать из среды выполнения Objective C, если вы знакомы с C. API C ++ вызывается из Objective C ++, поэтому его будет проще использовать, если вы знакомы с Objective C ++.

Я не использовал привязки C или C ++; Я сделал это через Ruby или Python, но это все та же библиотека. Он будет читать прямой XML (а также потенциально грязный HTML) и имеет как простые, так и красивые параметры печати. ​​

...