#include<libxml/parser.h> #include<libxml/tree.h> void writeXML(char* fileName) { xmlDocPtr doc; xmlNodePtr rootNode; xmlNodePtr basicNode; xmlNodePtr nodeContents; xmlNodePtr sonNode; xmlNodePtr grandsonNode; //create document doc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); rootNode = xmlNewNode(NULL,BAD_CAST "rootNode"); //set root node xmlDocSetRootElement(doc,rootNode); //add nodes xmlNewTextChild(rootNode, NULL, BAD_CAST "nodes", BAD_CAST "nodes1"); xmlNewTextChild(rootNode, NULL, BAD_CAST "nodes", BAD_CAST "nodes2"); xmlNewTextChild(rootNode, NULL, BAD_CAST "nodes", BAD_CAST "nodes3"); //add a basic node which has attribute and contents basicNode = xmlNewNode(NULL,BAD_CAST "basicNode"); nodeContents = xmlNewText(BAD_CAST "contents"); xmlNewProp(basicNode,BAD_CAST "size",BAD_CAST "123");//add a attribute xmlAddChild(basicNode,nodeContents);//add contents to node xmlAddChild(rootNode,basicNode);//add node to root //nesting sonNode = xmlNewNode(NULL,BAD_CAST "son"); grandsonNode = xmlNewNode(NULL,BAD_CAST "grandson"); xmlAddChild(grandsonNode,xmlNewText(BAD_CAST "nesting node")); xmlAddChild(sonNode,grandsonNode); xmlAddChild(rootNode,sonNode); //save file int save = xmlSaveFile(fileName,doc); if(save!=-1){ printf("write %d bytes\n",save); } //free memory xmlFreeDoc(doc); xmlCleanupParser(); } void readXML(char* fileName) { xmlDocPtr doc; xmlNodePtr node; xmlChar *key; doc = xmlReadFile(fileName,"UTF-8",XML_PARSE_RECOVER); if(doc == NULL){ return; } node = xmlDocGetRootElement(doc); if(node == NULL){ return; } if(!xmlStrcmp(node->name,BAD_CAST "root")){ xmlFreeDoc(doc); return; } node = node->xmlChildrenNode; xmlNodePtr attrNode = node; printf("start reading...\n"); while(node!=NULL){ if(!xmlStrcmp(node->name,(const xmlChar*)"basicNode")){ key = xmlNodeGetContent(node);//get the contents of the node printf("basicNode:%s\n",key); xmlFree(key); } if(xmlHasProp(node,BAD_CAST "size")){ attrNode = node;//save node which has attribute-"size" } node = node->next; } // get attribute xmlAttrPtr attrPtr = attrNode->properties; while(attrPtr!=NULL){ if (!xmlStrcmp(attrPtr->name, BAD_CAST "size")){ xmlChar* attr = xmlGetProp(attrNode,BAD_CAST "size"); printf("sizeAttr=%s\n",attr); xmlFree(attr); } attrPtr = attrPtr->next; } xmlFree(doc); } int main(){ char *fileName = "Demo.xml"; writeXML(fileName); readXML(fileName); } write 193 bytes start reading... basicNode:contents sizeAttr=123