2010-10-13 19 views
6

He intentado esto:¿Cómo puedo agregar un bloque de cdata usando GDataXMLNode?

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

Y SALIDAS:

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

Pero quiero que sea así:

<body><request> <! [CDATA [<hola>]] > </solicitud > < /body>

alguna idea de cómo puedo saber el analizador que el GDataXMLNode debe ser un tipo CDATA?

+0

encuentran siempre fuera? Me gustaría saber también – ransomweaver

+0

Además, esto da como resultado que el CDATA se elimine por completo: GDataXMLElement * n = [[GDataXMLElement alloc] initWithXMLString: @ "" error: nil]; – ransomweaver

+0

para obtener mystring ransomweaver

Respuesta

2

Sabía usted tratando usando:

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

Baseed de la fuente de este analiza directamente como XML:

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

Mientras elementWithName simplemente agarra la cadena literal:

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

Aunque este hilo es viejo, pensé que podría ser útil para alguien que tropieza con esto.

GDataXML no tiene soporte para CData implementado. Pero, parece fácil agregar esta funcionalidad. GDataXML usa libxml2 para crear documentos XML. En la sección libxml2 CData podría crearse como se sugiere en how to write a CDATA node using libxml2?.

Así, podríamos mejorar

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

método de GDataXMLNode tener un parámetro booleano que indica si necesitamos nodo programable CData y modificar la línea

xmlNodePtr textNode = xmlNewText(GDataGetXMLString(value)); 

para crear programable CData bloque en lugar de una bloque de texto

1

Agregue lo siguiente a GDataXMLNode.h

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

Agregue lo siguiente al 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); 
     } 
    } 
} 

No es necesario el método setCDataStringValue para este ejemplo pero lo incluyeron todos modos, por lo que la opción de crear el GDataXMLNode y añadir la programable CData más tarde.

Su ejemplo se convertiría entonces en:

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

que da salida:

<body><response><![CDATA[<hello>]]></response></body> 
Cuestiones relacionadas