如何使用GDataXMLNode添加cdata块?

时间:2010-10-13 02:16:31

标签: iphone xml

我试过这个:

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类型?

3 个答案:

答案 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>