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

原创粉丝点击