2

XMLドキュメントを作成する必要があるiOS用のアプリケーションを作成しています。私はKissXMLを介してこれを行います。XMLの一部は次のようになります

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

KissXMLにCDATAパーツを作成するためのオプションが見つかりません。テキストとしてCDATAのものを含む文字列を追加するだけで、<や>などの特殊文字がエスケープされます。KissXMLを使用してCDATAを作成する方法のヒントを教えてもらえますか?

4

2 に答える 2

1

@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

コードはこの要点でも入手できます。

于 2012-11-21T13:37:56.110 に答える
0

自分で回避策を見つけました。基本的には、CDATAを新しいXMLドキュメントに偽装することです。動作するいくつかのコード:

+(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];
}

もう!これは、私が「ダーティハック」と見なすものにすぎません。動作しますが、気分が悪くなります。これに対する「良い」解決策をいただければ幸いです。

于 2012-08-02T12:57:41.453 に答える