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("\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);
}

posted @   LiuYanYGZ  阅读(117)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示