libxml2 的一个简单测试示例

libxml2是一个C语言的XML库,能简单方便的提供对XML文件的各种操作,详细的描述可以查看:http://xmlsoft.org/

Android中该库的源码在:external\libxml2
如果是C++可以参看external\tinyxml2

以下是简单的解析xml文件代码:

xml文件如下:

<xmlinfo>
    <version>xmlinfo1.0</version>
    <keyinfo>FCtuwb2LO4evFri</keyinfo>
    <chain>
        <body>MIIDgzCCAmugAwIBAg</body>
        <body>MIIDPDCCAiSgAwIBA</body>
    </chain>
</xmlinfo>

解析代码如下:

/********************************************************************
    created:   2018/09/06
    filename:  main.c
    author:    Albert
    depend:    libxml2.so 
    build:     mm
    purpose:   parse a xml 
*********************************************************************/


#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>


int main(int argc, char** argv)
{
    xmlDocPtr doc; //定义解析文件指针
    xmlNodePtr curNode; //定义结点指针,需要它在各个结点间移动
    xmlChar *szKey; //临时字符串变量

    char *szDocName;

    if (argc <= 1)
    {
        printf("Usage : %s docname \n", argv[0]);
        return -1;
    }

    szDocName = argv[1];

    /*解析文件*/
    doc = xmlParseFile(szDocName);

    if ( NULL == doc)
    {
        fprintf(stderr,"Document not parsed successfully. \n");
        return -1;
    }

    /*确定文件根元素*/
    curNode = xmlDocGetRootElement(doc);
    if ( NULL == curNode )
    {
        fprintf(stderr,"empty document \n"); 
        xmlFreeDoc(doc); 
        return -1; 
    }

    printf("curNode->name = %s \n", curNode->name);
    if ( xmlStrcmp( curNode->name, BAD_CAST"xmlinfo" ) )
    {
        fprintf(stderr,"document of the wrong type, root node != xmlinfo\n"); 
        xmlFreeDoc(doc); 
        return -1; 
    }

    curNode = curNode->children;
    xmlNodePtr propNodePtr = curNode;

    while ( curNode != NULL )
    {
        /*取出结点中的内容*/
        if ( !xmlStrcmp( curNode->name, BAD_CAST"version" ) )
        {
            szKey = xmlNodeGetContent(curNode);
            printf("version: %s \n", szKey); 
            xmlFree(szKey); 
        }

        /*取出结点中的内容*/
        if ( !xmlStrcmp( curNode->name, BAD_CAST"keyinfo" ) )
        {
            szKey = xmlNodeGetContent(curNode);
            printf("keyinfo: %s \n", szKey); 
            xmlFree(szKey); 
        }

        /*取出结点中的内容*/
        if ( !xmlStrcmp( curNode->name, BAD_CAST"chain" ) )
        {
            propNodePtr = curNode->children;
            while( propNodePtr != NULL )
            {
                /*取出结点中的内容*/
                if ( !xmlStrcmp( propNodePtr->name, BAD_CAST"body" ) )
                {
                    szKey = xmlNodeGetContent(propNodePtr);
                    printf("body: %s \n", szKey); 
                    xmlFree(szKey); 
                }

                propNodePtr = propNodePtr->next;
            }
        }

        curNode = curNode->next; 
    }

    xmlFreeDoc( doc );
    return 0;   
}

结果如下:
curNode->name = xmlinfo
version: xmlinfo1.0
keyinfo: FCtuwb2LO4evFri
body: MIIDgzCCAmugAwIBAg
body: MIIDPDCCAiSgAwIBA

猜你喜欢

转载自blog.csdn.net/haidao1101/article/details/82495650