2012-04-28 17 views
7

estoy usando libxml en C y esto es cómo creo xml:libxml2 no puede acercarse contenido del nodo

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; 
} 

y así es como quiero obtener datos de que 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; 
} 

Cuando pruebo headerNode-> name o -> next-> name, los nombres son correctos (son los nombres de esos elementos) pero el contenido devuelve null. ¿Alguien sabe dónde está el problema?

Respuesta

11

Respuesta corta: use xmlNodeGetContent.

Los nodos de elementos en sí no contienen contenido. En cambio, tienen nódulos de texto para niños, y esos contienen contenido. El contenido de un elemento puede ser una mezcla de texto y etiquetas, y esto le permite mantener el orden, representar entidades, etc.

Podría iterar sobre los nodos secundarios y mirar SUS miembros de contenido, pero xmlNodeGetContent hace eso para usted, y manejará adecuadamente las etiquetas y entidades infantiles.

Cuestiones relacionadas