2010-10-13 10 views
6

मैं इस की कोशिश की है:मैं GDataXMLNode का उपयोग कर एक सीडीएटी ब्लॉक कैसे जोड़ सकता हूं?

GDataXMLElement * body = [GDataXMLNode elementWithName:@"body"]; 
[body addChild:[GDataXMLNode elementWithName:@"request" stringValue:@"<![CDATA[ <hello> ]]>"]]; 
NSLog(@"%@",[body XMLString]); 

और यह आउटपुट:

<body><request>& lt ;![CDATA[ & lt ;hello & जीटी ; ]] & जीटी ; < /request></body`>

लेकिन यह इस तरह होना चाहिए:

<body><request> <! [CDATA [< हैलो >]] > </अनुरोध > < /body>

किसी भी विचार कैसे मैं पार्सर कि GDataXMLNode एक CDATA तरह होना चाहिए बता सकते हैं?

const char *utf8Str = [str UTF8String]; 
xmlDocPtr doc = xmlReadMemory(utf8Str, (int)strlen(utf8Str), NULL, // URL 
           NULL, // encoding 
           kGDataXMLParseOptions); 

elementWithName जबकि सिर्फ स्ट्रिंग शब्दशः पकड़ लेता है:

[[GDataXMLElement alloc] initWithXMLString:"<![CDATA[ .... ]]>"] 

Baseed स्रोत पर इस यह XML के रूप में सीधे पार्स करता है:

+0

कभी पता चला? मैं भी जानना चाहता हूं। – ransomweaver

+0

इसके अलावा, सीडीएटीए में पूरी तरह से छीन लिया गया है: GDataXMLElement * n = [[GDataXMLElement alloc] initWithXMLString: @ "" त्रुटि: शून्य]; – ransomweaver

+0

तो आपको mystring ransomweaver

उत्तर

2

आप उपयोग कर की कोशिश कर रहा था

+ (GDataXMLElement *)elementWithName:(NSString *)name { 
    xmlNodePtr theNewNode = xmlNewNode(NULL, // namespace 
             GDataGetXMLString(name)); 
    if (theNewNode) { 
    // succeeded 
    return [self nodeConsumingXMLNode:theNewNode]; 
} 
return nil; 
1

हालांकि यह धागा पुराना है, मैंने सोचा कि यह किसी के लिए ठोकर खा सकता है।

GDataXML को सीडीएटी लागू करने के लिए समर्थन नहीं है। लेकिन, यह कार्यक्षमता जोड़ने में आसान लग रहा है। XML दस्तावेज़ बनाने के लिए GDataXML libxml2 का उपयोग करता है। Libxml2 सीडीटा अनुभाग में how to write a CDATA node using libxml2? में सुझाए गए अनुसार बनाया जा सकता है।

तो, हम एक बूलियन पैरामीटर का संकेत है कि क्या हम CDATA नोड की जरूरत लाइन

xmlNodePtr textNode = xmlNewText(GDataGetXMLString(value)); 

CDATA ब्लॉक बनाने के लिए एक के बजाय और संशोधित करने के लिए GDataXMLNode की

+ (GDataXMLElement *)elementWithName:(NSString *)name stringValue:(NSString *)value

विधि को बढ़ाने सकता है टेक्स्ट ब्लॉक

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> 
संबंधित मुद्दे

 संबंधित मुद्दे