2012-08-02 58 views
2

我正在爲需要創建XML文檔的iOS創建應用程序。我通過KissXML來做到這一點。部分XML看起來像如何使用KissXML編寫CDATA?

<ISIN><![CDATA[12345678]]></ISIN> 

我在KissXML中找不到任何選項來創建CDATA部分。簡單地添加一個字符串作爲文本的CDATA的東西將導致逃避特殊字符,如<和>。任何人都可以給我一個關於如何使用KissXML編寫CDATA的提示?

回答

0

即使the solution by @moq是醜陋的,它的工作原理。我清理了字符串創建代碼並將其添加到一個類別中。

DDXMLNode + CDATA.h:

#import <Foundation/Foundation.h> 
#import "DDXMLNode.h" 

@interface DDXMLNode (CDATA) 

/** 
Creates a new XML element with an inner CDATA block 
<name><![CDATA[string]]></name> 
*/ 
+ (id)cdataElementWithName:(NSString *)name stringValue:(NSString *)string; 

@end 

DDXMLNode + CDATA.m:

#import "DDXMLNode+CDATA.h" 
#import "DDXMLElement.h" 
#import "DDXMLDocument.h" 

@implementation DDXMLNode (CDATA) 

+ (id)cdataElementWithName:(NSString *)name stringValue:(NSString *)string 
{ 
    NSString* nodeString = [NSString stringWithFormat:@"<%@><![CDATA[%@]]></%@>", name, string, name]; 
    DDXMLElement* cdataNode = [[DDXMLDocument alloc] initWithXMLString:nodeString 
                   options:DDXMLDocumentXMLKind 
                   error:nil].rootElement; 
    return [cdataNode copy]; 
} 

@end 

的代碼也是在這個gist可用。

0

我自己找到了解決方法 - 這個想法基本上是將CDATA僞裝成一個新的XML Doc。一些可用的代碼:

+(DDXMLElement*) createCDataNode:(NSString*)name value:(NSString*)val { 

    NSMutableString* newVal = [[NSMutableString alloc] init]; 
    [newVal appendString:@"<"]; 
    [newVal appendString:name]; 
    [newVal appendString:@">"]; 
    [newVal appendString:@"<![CDATA["]; 
    [newVal appendString:val]; 
    [newVal appendString:@"]]>"]; 
    [newVal appendString:@"</"]; 
    [newVal appendString:name]; 
    [newVal appendString:@">"]; 

    DDXMLDocument* xmlDoc = [[DDXMLDocument alloc] initWithXMLString:newVal options:DDXMLDocumentXMLKind error:nil]; 

    return [[xmlDoc rootElement] copy]; 
} 

GEEZ!這只是我認爲是一個「骯髒的黑客」。它有效,但感覺不對。我會很感激這個「好」的解決方案。