2010-10-13 2 views
6

J'ai essayé ceci:Comment puis-je ajouter un bloc cdata en utilisant GDataXMLNode?

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

Et sorties:

<body><request>& lt ;![CDATA[ & lt ;hello & gt ; ]] & gt ; < /request></body`>

Mais je veux que ce soit comme ça:

<body><request> <! [CDATA [<bonjour>]] > </demande > < /body>

toute idée comment puis-je dire à l'analyseur que le GDataXMLNode devrait être une sorte CDATA?

+0

trouver jamais sortir? J'aimerais savoir aussi. – ransomweaver

+0

En outre, cela se traduit par l'élimination complète du CDATA: GDataXMLElement * n = [[GDataXMLElement alloc] initWithXMLString: @ "" erreur: nil]; – ransomweaver

+0

alors vous obtenez mystring ransomweaver

Répondre

2

Avez-vous essayer à l'aide:

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

Baseed sur la source de cette analyse directement au format XML:

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

Alors que elementWithName saisit simplement la chaîne verbatim:

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

Bien ce fil est vieux, je pensais que ça pourrait être utile pour quelqu'un qui trébucherait sur ça.

GDataXML ne prend pas en charge la mise en œuvre de CData. Mais, il semble facile d'ajouter cette fonctionnalité. GDataXML utilise libxml2 pour créer un document XML. Dans libxml2, la section CData peut être créée comme suggéré dans how to write a CDATA node using libxml2?.

Ainsi, nous pourrions améliorer

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

méthode

de GDataXMLNode avoir un paramètre booléen indiquant si nous avons besoin de noeud CData et modifier la ligne

xmlNodePtr textNode = xmlNewText(GDataGetXMLString(value)); 

pour créer CData bloc au lieu d'un Bloc de texte

1

Ajoutez les éléments suivants à GDataXMLNode.h

+ (GDataXMLElement *)elementWithName:(NSString *)name cDataStringValue:(NSString *)value; 
- (void)setCDataStringValue:(NSString *)value; 

Ajouter ce qui suit à 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); 
     } 
    } 
} 

Vous n'avez pas besoin de la méthode setCDataStringValue pour cet exemple, mais je les inclus de toute façon, de sorte que vous pouvez éventuellement créer le GDataXMLNode et ajouter plus tard CData.

Votre exemple deviendrait alors:

GDataXMLElement * body = [GDataXMLNode elementWithName:@"body"]; 
GDataXMLElement * response = [GDataXMLNode elementWithName:@"response" cDataStringValue:@"<hello>"]; 
[body addChild:response]; 
NSLog(@"%@",[body XMLString]); 

qui délivre en sortie:

<body><response><![CDATA[<hello>]]></response></body> 
Questions connexes