本文已参与「新人创作礼」活动,一起开启掘金创作之路。
头文件的包含:
#include <libxml/parser.h>
#include <libxml/xmlmemory.h>
#include <libxml/xinclude.h>
动态库的链接:-lxml2
xml数据类型定义:
在tree.h头文件里
| xmlDocPtr | Xml 文档数据类型,一个xml文档里会包含很多个node |
|---|---|
| xmlNodePtr | xml元素的数据类型,每个元素在文档里代表一个node |
| xmlChar | xml字符类型定义 |
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文件 |
| xmlStrcmp | xml字符比较,相同返回0 |
| xmlStrstr | xml字符包含比较(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;`
}`