2012-04-28 70 views
7

我使用C中的libxml獲取內容,這是我如何創建XML:libxml2的不可阻擋從節點

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

,這是我要如何從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; 
} 

當我測試headerNode-> name或 - > next->名稱時,名稱是正確的(它是元素的名稱),但內容返回null。任何人都知道問題在哪裏?

回答

11

簡答題:使用xmlNodeGetContent

元素節點本身不包含內容。相反,他們有孩子的文本節點,並且包含內容。元素的內容可能是文本和標籤的混合,這使得它可以維護排序,表示實體等。

您可以迭代子節點並查看THEIR內容成員,但xmlNodeGetContent會這樣做爲你,並將妥善處理兒童標籤和實體。