Как написать CDATA с KissXML?

Я создаю приложение для iOS, которое должно создать документ XML. Я делаю это через KissXML. Часть XML выглядит так

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

Я не могу найти какой-либо вариант в KissXML для создания части CDATA. Простое добавление строки с данными CDATA в качестве текста приведет к экранированию специальных символов, таких как <и>. Кто-нибудь может дать мне подсказку, как писать CDATA с KissXML?

2 ответа

Решение

Хотя решение @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

Код также доступен в этой сути.

Я нашел обходной путь сам - идея заключается в том, чтобы замаскировать 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! Это просто то, что я бы назвал "грязным взломом". Это работает, но это не правильно. Буду признателен за "хорошее" решение этой проблемы.

Другие вопросы по тегам