2011-06-19 4 views
7

私はiOSアプリケーションにGDataXMLを使用してXML文字列をフォーマットして印刷するための簡単な方法を望んでいます - 「かわいいプリント」をのiOS - XMLプリティ印刷

誰もが客観Cにおけるアルゴリズム、または1つを知っています私は翻訳できる別の言語で動作しますか?

答えて

1

私はこのようなことにHTML Tidy(http://tidy.sourceforge.net/)を使用しました。これはCライブラリですので、Cに慣れていればかなり簡単にObjective Cランタイムにリンクして呼び出すことができます。C++ APIはObjective C++から呼び出すことができます。 Objective C++。

私はCまたはC++バインディングを使用していません。私はRubyやPythonでやりましたが、すべて同じlibです。それはまっすぐなXML(潜在的に汚れたHTMLと同様に)を読むでしょうし、シンプルでかわいい印刷オプションの両方を持っています。

13

あなたは直接使う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