libxml2 解析文档的例子(mingw)
来源:互联网 发布:eplan软件 编辑:程序博客网 时间:2024/05/22 10:30
#include <stdio.h>#include <string.h>//在mingw环境下,xmlfree 等可能出现问题,见http://blog.csdn.net/king_on/article/details/7543577#define IN_LIBXML#include <libxml/parser.h>#include <libxml/tree.h>/**判断节点是否是叶子节点1. 如果node=NULL,return 02. 如果node->type不是XML_ELEMENT_NODE,return 03. 如果node->type为XML_ELEMENT_NODE,并且node->children中没有XML_ELEMENT_NODE类型的节点,那么return 1*/int isLeafNode(xmlNode *node){ if(node==NULL) return(0); if(node->type!=XML_ELEMENT_NODE) return(0); xmlNode *childNode; for(childNode=node->children;childNode!=NULL;childNode=childNode->next) { if(childNode->type==XML_ELEMENT_NODE) return(0); } return(1);}void print(xmlDocPtr doc,xmlNode *rootNode){ xmlNode *curNode; xmlChar *v; for(curNode=rootNode; curNode!=NULL; curNode=curNode->next) { if(curNode->type==XML_ELEMENT_NODE) { printf("node name:%s",curNode->name); if(isLeafNode(curNode)) { v=xmlNodeGetContent(curNode);//获取节点内容 printf("\tnode value:%s",v); xmlFree(v);//施放v } xmlAttr *attr=curNode->properties;//首个节点或NULL while(attr!=NULL) { v=xmlGetProp(curNode,attr->name);//获取属性内容 printf("\tattr(%s)=%s",attr->name,v); xmlFree(v);//施放v attr=attr->next; } printf("\n"); } print(doc,curNode->children); }}int main(int argv,char *argc[]){ LIBXML_TEST_VERSION xmlDocPtr doc; //XML_PARSE_NOBLANKS 在解析时忽略空节点 doc=xmlReadFile(argc[1],NULL,XML_PARSE_NOBLANKS); //在mingw环境下,xmlfree 等可能出现问题,见http://blog.csdn.net/king_on/article/details/7543577 if(!xmlFree) xmlMemGet(&xmlFree,&xmlMalloc,&xmlRealloc,NULL); xmlNode *rootNode=xmlDocGetRootElement(doc); print(doc,rootNode); xmlFreeDoc(doc); xmlCleanupParser(); return(0);}