2010-10-13 11 views
6

Ich habe dies versucht:Wie kann ich einen cdata-Block mit GDataXMLNode hinzufügen?

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

Und es gibt:

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

Aber so soll es sein:

<body><request> <! [CDATA [<hallo>]] > </Anfrage > < /body>

eine Ahnung, wie kann ich den Parser sagen, dass die GDataXMLNode eine CDATA Art sein sollte?

+0

jemals herausfinden? Ich würde es auch gerne wissen. – ransomweaver

+0

Dies führt auch dazu, dass die CDATA vollständig entfernt wird: GDataXMLElement * n = [[GDataXMLElement-Zuweisung] initWithXMLString: @ "" error: nil]; – ransomweaver

+0

so erhalten Sie Mystring ransomweaver

Antwort

2

Haben Sie versucht, mit:

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

Baseed auf die Quelle dieses direkt als XML analysiert:

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

Während elementWithName nur die Zeichenfolge packt wörtlich:

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

Obwohl dieser Thread ist alt, ich dachte, es könnte hilfreich sein, wenn jemand in diese Sache hineinstolpert.

GDataXML haben keine Unterstützung für CData umgesetzt. Aber es scheint einfach zu sein, diese Funktionalität hinzuzufügen. GDataXML verwendet libxml2 zum Erstellen eines XML-Dokuments. Im libxml2-CData-Abschnitt könnte wie in how to write a CDATA node using libxml2? vorgeschlagen erstellt werden.

So konnten wir

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

Methode der GDataXMLNode verbessern ein boolean Parameter anzeigt, haben, ob wir CData Knoten benötigen, und ändern Sie die Zeile

xmlNodePtr textNode = xmlNewText(GDataGetXMLString(value)); 

CDATA-Block statt eines zu erstellen Textblock

1

Ergänzen Sie GDataXMLNode.h

Fügen Sie den folgenden zu 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); 
     } 
    } 
} 

Sie brauchen nicht die setCDataStringValue Methode für dieses Beispiel aber ich eingeschlossen es trotzdem, so dass Sie optional die GDataXMLNode erstellen und fügen Sie später die CData.

Ihr Beispiel wäre dann:

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

Welche Ausgänge:

<body><response><![CDATA[<hello>]]></response></body> 
Verwandte Themen