2010-10-13 25 views
6

Bu denedim:GDataXMLNode'u kullanarak nasıl bir cdata bloğu ekleyebilirim?

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

ve bu çıktılar:

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

Ama böyle olmasını istiyorum:

<body>> < <request! [CDATA [<merhaba>]] > </istek > < /body>

Ben GDataXMLNode CDATA tür olmalıdır ayrıştırıcı söyleyebilir nasıl bir fikrin? Sadece kelimesi kelimesine dizesini yakalar

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

elementWithName Oysa: Bu XML olarak doğrudan ayrıştırır

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

Baseed kaynağına:

+0

Hiç öğrenmek? Ben de bilmek isterim. – ransomweaver

+0

Ayrıca, bu CDATA sonuçta tamamen çıkarılmış: GDataXMLElement * n = [[GDataXMLElement ayırma] initWithXMLString: @ "" hata: nil]; – ransomweaver

+0

böylecemystring – ransomweaver

cevap

2

kullanmakta çalışırken mü

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

rağmen Bu iş parçacığı eski, buna karışan birinin işe yarayacağını düşündüm.

GDataXML, uygulanan CData desteğine sahip değil. Ancak, bu işlevselliği eklemek kolay görünüyor. GDataXML, XML belgesi oluşturmak için libxml2'yi kullanır. Libxml2 CData bölümünde how to write a CDATA node using libxml2?'da önerildiği gibi oluşturulabilir.

Yani, bir yerine CData bloğu oluşturmak için hat

xmlNodePtr textNode = xmlNewText(GDataGetXMLString(value)); 

biz CData düğümü gerekli olup olmadığını, bir Boole parametre işaret ve değiştirmek için GDataXMLNode arasında

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

yöntemi geliştirmek olabilir metin bloğu

1

Aşağıdakileri ekleyin: GDataXMLNode.h

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

0 Bu örneğin setCDataStringValue yöntemini gerekmez 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); 
     } 
    } 
} 

aşağıdakileri ekleyin ancak isteğe bağlı olarak GDataXMLNode oluşturmak ve daha sonra CDATA ekleyebilir yüzden, yine de dahil.

Sizin örnek daha sonra olacaktı:

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

verir Hangi:

<body><response><![CDATA[<hello>]]></response></body> 
İlgili konular