zoukankan      html  css  js  c++  java
  • libxml2 解析文档的例子

    #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 0
    2. 如果node->type不是XML_ELEMENT_NODE,return 0
    3. 如果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("	node value:%s",v);
                    xmlFree(v);//施放v
                }
                xmlAttr *attr=curNode->properties;//首个节点或NULL
                while(attr!=NULL)
                {
                    v=xmlGetProp(curNode,attr->name);//获取属性内容
                    printf("	attr(%s)=%s",attr->name,v);
                    xmlFree(v);//施放v
                    attr=attr->next;
                }
                printf("
    ");
            }
            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);
    }
    

  • 相关阅读:
    模板方法模式
    Centos 6.4 python 2.6 升级到 2.7
    Python 在Visual studio 中做单元测试进行TDD开发
    C# 代码转换到Python
    VMware Network Adapter VMnet1和VMnet8 未识别的网络的解决方法
    Visual Studio 启动加速
    查询Sqlserver 表结构信息 SQL
    HTTP发送请求模拟
    【Xamarin 开发 IOS --使用 Storyboard Segue 实作 UIViewController 的切换 (实例)】
    【Xamarin 开发 IOS --IOS 页面导航概念Segue】
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/15190648.html
Copyright © 2011-2022 走看看