2012-04-28 12 views
7

używam libxml w C iw ten sposób tworzę xml:libxml2 can not uzyskać zawartość od węzła

xmlDocPtr createXmlSegment(char *headerContent, char *dataContent) 
{ 
    xmlDocPtr doc; 
    doc = xmlNewDoc(BAD_CAST "1.0"); 
    xmlNodePtr rdt, header, data; 
    rdt = xmlNewNode(NULL, BAD_CAST "rdt-segment"); 
    xmlSetProp(rdt, "id", "1"); 
    header = xmlNewNode(NULL,BAD_CAST "header"); 
    data = xmlNewNode(NULL, BAD_CAST "data"); 
    xmlNodeSetContent(header, BAD_CAST headerContent); 
    xmlNodeSetContent(data, BAD_CAST dataContent); 
    xmlAddChild(rdt, header); 
    xmlAddChild(rdt, data); 
    xmlDocSetRootElement(doc, rdt); 
    return doc; 
} 

i to jest jak chcę uzyskać dane z tego xml:

int getDataFromXmlSegment(char *data, char *header, char *content) 
{ 
    xmlDocPtr doc = xmlReadMemory(data, strlen(data), NULL, NULL, XML_PARSE_NOBLANKS); 
    xmlNode *rdt = doc->children; 
    xmlNode *headerNode = rdt->children; 
    header = (char *)headerNode->content; 
    content = (char *)headerNode->next->content; 
    printf("header: %s, content: %s", header, content); 
    return EXIT_SUCCESS; 
} 

Kiedy testuję headerNode-> name lub -> next-> name, wtedy nazwy są poprawne (to nazwy tych elementów), ale zawartość zwraca null. Ktoś wie, gdzie jest problem?

Odpowiedz

11

Krótka odpowiedź: użyj xmlNodeGetContent.

Same węzły elementów nie zawierają treści. Zamiast tego mają węzły tekstowe podrzędne, a te zawierają treść. Zawartość elementu może być połączeniem tekstu i znaczników, a to pozwala zachować porządek, reprezentować elementy itp.

Można wykonywać iteracje nad węzłami potomnymi i patrzeć na ICH członków zawartości, ale robi to XmlNodeGetContent dla ciebie i będzie poprawnie obsługiwać znaczniki i obiekty podrzędne.

Powiązane problemy