我試圖這樣:如何使用GDataXMLNode添加一個cdata塊?
,並將其輸出:
<body
><request
>&
LT ;![CDATA[
& LT ;hello
& GT ; ]]
& GT ;
< /request
><
/body`>
但希望它是這樣的:
<body
><request
> <![CDATA [<你好>] > <
/請求>
< /body
>
任何想法我怎麼能告訴解析器的GDataXMLNode應該是CDATA樣的?
我試圖這樣:如何使用GDataXMLNode添加一個cdata塊?
,並將其輸出:
<body
><request
>&
LT ;![CDATA[
& LT ;hello
& GT ; ]]
& GT ;
< /request
><
/body`>
但希望它是這樣的:
<body
><request
> <![CDATA [<你好>] > <
/請求>
< /body
>
任何想法我怎麼能告訴解析器的GDataXMLNode應該是CDATA樣的?
你有沒有嘗試使用:
[[GDataXMLElement alloc] initWithXMLString:"<![CDATA[ .... ]]>"]
Baseed源在此直接將其解析爲XML:
const char *utf8Str = [str UTF8String];
xmlDocPtr doc = xmlReadMemory(utf8Str, (int)strlen(utf8Str), NULL, // URL
NULL, // encoding
kGDataXMLParseOptions);
而elementWithName
只是抓住逐字的字符串:
+ (GDataXMLElement *)elementWithName:(NSString *)name {
xmlNodePtr theNewNode = xmlNewNode(NULL, // namespace
GDataGetXMLString(name));
if (theNewNode) {
// succeeded
return [self nodeConsumingXMLNode:theNewNode];
}
return nil;
雖然這個線程很老,我認爲這可能對有人陷入困境有所幫助。
GDataXML不支持實現的CData。但是,添加此功能看起來很容易。 GDataXML使用libxml2來創建XML文檔。在libxml2中,可以按照how to write a CDATA node using libxml2?中的建議創建CData部分。
所以,我們可以提高GDataXMLNode的
+ (GDataXMLElement *)elementWithName:(NSString *)name stringValue:(NSString *)value
方法具有指示布爾參數是否需要CData的節點並修改該行
xmlNodePtr textNode = xmlNewText(GDataGetXMLString(value));
創建CDATA塊中,而不是文本塊
將以下內容添加到GDataXMLNode.h中
+ (GDataXMLElement *)elementWithName:(NSString *)name cDataStringValue:(NSString *)value;
- (void)setCDataStringValue:(NSString *)value;
以下添加到GDataXMLNode.m
+ (GDataXMLElement *)elementWithName:(NSString *)name cDataStringValue:(NSString *)value {
xmlNodePtr theNewNode = xmlNewNode(NULL, // namespace
GDataGetXMLString(name));
if (theNewNode) {
NSUInteger length = [value lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
xmlNodePtr textNode = xmlNewCDataBlock(theNewNode->doc, GDataGetXMLString(value), length);
if (textNode) {
xmlNodePtr temp = xmlAddChild(theNewNode, textNode);
if (temp) {
// succeeded
return [self nodeConsumingXMLNode:theNewNode];
}
}
// failed; free the node and any children
xmlFreeNode(theNewNode);
}
return nil;
}
- (void)setCDataStringValue:(NSString *)value {
if (xmlNode_ != NULL && value != nil) {
NSUInteger length = [value lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
xmlNodePtr textNode = xmlNewCDataBlock(xmlNode_->doc, GDataGetXMLString(value), length);
if (textNode) {
xmlAddChild(xmlNode_, textNode);
}
}
}
你不需要爲這個例子中setCDataStringValue方法,但我把它,所以你可以選擇創建GDataXMLNode後來添加在CDATA。
你的例子則變成:
GDataXMLElement * body = [GDataXMLNode elementWithName:@"body"];
GDataXMLElement * response = [GDataXMLNode elementWithName:@"response" cDataStringValue:@"<hello>"];
[body addChild:response];
NSLog(@"%@",[body XMLString]);
,輸出:
<body><response><![CDATA[<hello>]]></response></body>
曾經發現的?我也想知道。 – ransomweaver 2010-10-30 12:54:00
此外,這導致CDATA被完全剝離:GDataXMLElement * n = [[GDataXMLElement alloc] initWithXMLString:@「<![CDATA [mystring]]> 」error:nil]; –
ransomweaver
2010-10-30 14:34:06
所以你得到 mystring –
ransomweaver
2010-10-30 14:36:09