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