2010-10-13 14 views
6

Próbowałem następująco:Jak dodać blok cdata za pomocą GDataXMLNode?

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

i wyprowadza:

<body><request>& LT ;![CDATA[ & LT ;hello & ; ]] & GT GT ; < /request></organ do spraw>

Ale chcesz, żeby było tak:

<body><request> <! [CDATA [< cześć >]] > </prośba > < /body>

jakiś pomysł jak mogę powiedzieć, że parser GDataXMLNode powinny być rodzajem CDATA?

+0

kiedykolwiek dowiedzieć? Chciałbym też wiedzieć. – ransomweaver

+0

Powoduje to całkowite usunięcie CDATA: GDataXMLElement * n = [[przydział GDataXMLElement] initWithXMLString: @ "" error: nil]; – ransomweaver

+0

, więc dostaniesz mistring ransomweaver

Odpowiedz

2

Czy próbując przy użyciu:

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

Baseed źródła to analizuje go bezpośrednio jako XML:

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

Zważywszy elementWithName prostu chwyta ciąg verbatim:

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

Choć ten wątek jest stary, pomyślałem, że może być pomocny dla kogoś, kto się o to potyka.

GDataXML nie obsługuje wersji CData. Ale łatwo można dodać tę funkcję. GDataXML używa biblioteki libxml2 do tworzenia dokumentu XML. W sekcji libxml2 sekcja CData może zostać utworzona zgodnie z sugestią w how to write a CDATA node using libxml2?.

Tak, możemy zwiększyć

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

metodę GDataXMLNode mieć logiczną parametr wskazujący, czy musimy węzeł CDATA i zmodyfikować linię

xmlNodePtr textNode = xmlNewText(GDataGetXMLString(value)); 

do tworzenia CDATA blok zamiast blok tekstu

1

Dodaj następujące elementy do GDataXMLNode.h

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

Dodaj poniższe linie do 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); 
     } 
    } 
} 

Nie musisz metodę setCDataStringValue dla tego przykładu, ale włączyła ją tak, więc można opcjonalnie utworzyć GDataXMLNode i dodać CDATA później.

Twój Przykładem może wtedy stać:

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

które wyjścia:

<body><response><![CDATA[<hello>]]></response></body> 
Powiązane problemy