2010-10-13 24 views
6

我試圖這樣:如何使用GDataXMLNode添加一個cdata塊?

​​

,並將其輸出:

<body><request>& LT ;![CDATA[ & LT ;hello & GT ; ]] & GT ; < /request></body`>

但希望它是這樣的:

<body><request> <![CDATA [<你好>] > < /請求> < /body>

任何想法我怎麼能告訴解析器的GDataXMLNode應該是CDATA樣的?

+0

曾經發現的?我也想知道。 – ransomweaver 2010-10-30 12:54:00

+0

此外,這導致CDATA被完全剝離:GDataXMLElement * n = [[GDataXMLElement alloc] initWithXMLString:@「<![CDATA [mystring]]>」error:nil]; – ransomweaver 2010-10-30 14:34:06

+0

所以你得到 mystring ransomweaver 2010-10-30 14:36:09

回答

2

你有沒有嘗試使用:

[[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; 
1

雖然這個線程很老,我認爲這可能對有人陷入困境有所幫助。

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塊中,而不是文本塊

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>