libxml2的使用

419 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

头文件的包含:

#include <libxml/parser.h>

#include <libxml/xmlmemory.h>

#include <libxml/xinclude.h>

动态库的链接:-lxml2

xml数据类型定义:

在tree.h头文件里

xmlDocPtrXml 文档数据类型,一个xml文档里会包含很多个node
xmlNodePtrxml元素的数据类型,每个元素在文档里代表一个node
xmlCharxml字符类型定义

xmlNodePtr类型作为重点需要了解的;

const xmlChar   *name指向当前元素(节点)的名字
struct _xmlNode *children指向当前元素的子元素,子节点
struct _xmlNode *next指向当前元素的下一个节点
xmlChar         *content指向当前元素的内容

/**

 * xmlNode:

 *

 * A node in an XML tree.

 */

typedef struct _xmlNode xmlNode;

typedef xmlNode *xmlNodePtr;

struct _xmlNode {

    void           *_private;        /* application data */

    xmlElementType   type;        /* type number, must be second ! */

    const xmlChar   *name;      /* the name of the node, or the entity */

    struct _xmlNode *children;        /* parent->childs link */

    struct _xmlNode *last;        /* last child link */

    struct _xmlNode *parent;        /* child->parent link */

    struct _xmlNode *next;        /* next sibling link  */

    struct _xmlNode *prev;        /* previous sibling link  */

    struct _xmlDoc  *doc;        /* the containing document */

  


    /* End of common part */

    xmlNs           *ns;        /* pointer to the associated namespace */

    xmlChar         *content;   /* the content */

    struct _xmlAttr *properties;/* properties list */

    xmlNs           *nsDef;     /* namespace definitions on this node */

    void            *psvi;        /* for type/PSVI informations */

    unsigned short   line;        /* line number */

    unsigned short   extra;        /* extra data for XPath/XSLT */

};

使用到的函数

函数名说明
xmlReadFile读取xml文件,支持编码格式和远程文件
xmlParseFile读取xml文件,只支持本地文件
xmlDocGetRootElement获取当前xml文件的根元素(第一个父元素)
xmlXIncludeProcess解析include包含的外部xml文件
xmlStrcmpxml字符比较,相同返回0
xmlStrstrxml字符包含比较(str1,str2), 返回非空表示str1包含str2
xmlNodeGetContent获取当前节点的内容,以字符的形式存在
xmlGetProp获取当前节点的属性,以字符的形式存在
xmlFree释放xml节点内容的内存
xmlFreeDoc释放xml文档的内存

样例

int lifecycleParseConfig(const char* file)`

{`

    if(NULL == file) {`

        LC_ERR("Please start this program with xmlfilepath!");`

        return -1;`

    }`

    //获取XML文档的指针`

    //使用xmlReadFile支持编码格式的设置和url的方式读取xml文件`

    //也可以使用xmlParseFile函数解析本地文件`

    xmlDocPtr pDoc = xmlReadFile(file, "UTF-8", XML_PARSE_RECOVER);`

    if(NULL == pDoc) {`

        LC_ERR("xmlParseFile Error");`

        return -1;`

    }`

    //获取根节点`

    xmlNodePtr pRoot = xmlDocGetRootElement(pDoc);`

    if(NULL == pRoot) {`

        LC_ERR("xmlDocGetRootElement Error");`

        xmlFreeDoc(pDoc);`

        return -1;`

    }`

    //解析包含的文档`

    if(xmlXIncludeProcess(pDoc) <0) {`

        LC_ERR("xmlXIncludeProcess Error");`

    }`

    //获取子节点`

    xmlNodePtr pFirst = pRoot->xmlChildrenNode;`

  


    while(NULL != pFirst) {`

        //比较当前节点名字是否匹配`

        if(!xmlStrcmp(pFirst->name, (const xmlChar *)("lifecycle_group_size"))) {`

            //获取当前节点的内容`

            xmlChar* value = xmlNodeGetContent(pFirst);`

            printf("%s: %s\n", pFirst->name, value);`

           //释放获取xml内容时创建的内存`

            xmlFree(value);`

        }`

        //比较当前节点的名字是否包含“domain”字符`

        else if(NULL != xmlStrstr(pFirst->name, (const xmlChar *)("domain"))) {`

            ParseSevice(pFirst, groupTab);`

        }`

       //继续查找下一个同级的节点`

        pFirst = pFirst->next;`

    }`

    //释放创建xmlDoc时创建的内存`

    xmlFreeDoc(pDoc);`
    return 0;`
}`