我试过这个:
GDataXMLElement * body = [GDataXMLNode elementWithName:@"body"];
[body addChild:[GDataXMLNode elementWithName:@"request" stringValue:@"<![CDATA[ <hello> ]]>"]];
NSLog(@"%@",[body XMLString]);
它输出:
<body
&GT; <request
&GT; &
LT ;![CDATA[
&安培; LT ;hello
&安培; GT ; ]]
&安培; GT {{1 }}&LT; ;
&GT; /request
/ body`&GT;
但希望它是这样的:
<
&gt; <body
&gt;&lt;![CDATA [&lt; hello&gt; ]&GT; <request
/ {请求{1}}&LT; <
&GT;
任何想法如何告诉解析器GDataXMLNode应该是CDATA类型?
答案 0 :(得分:2)
您是否尝试使用:
[[GDataXMLElement alloc] initWithXMLString:"<![CDATA[ .... ]]>"]
基于源代码,它直接将其解析为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;
答案 1 :(得分:1)
虽然这个帖子已经老了,但我认为对于遇到这种情况的人来说可能会有所帮助。
GDataXML不支持CData实现。但是,添加此功能看起来很容易。 GDataXML使用libxml2来创建XML文档。在libxml2中,可以按照how to write a CDATA node using libxml2?中的建议创建CData部分。
所以,我们可以提升
+ (GDataXMLElement *)elementWithName:(NSString *)name stringValue:(NSString *)value
GDataXMLNode的方法有一个布尔参数,表明我们是否需要CData节点并修改该行
xmlNodePtr textNode = xmlNewText(GDataGetXMLString(value));
创建CData Block而不是文本块
答案 2 :(得分:1)
将以下内容添加到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>