【xml 解析库】expat使用学习

expat

头文件:

#include 

对应动态库:
libexpat.so

解析器创建与释放

XML_ParserCreate

  • XML_ParserCreate: Create a new parser object.
XML_Parser XML_ParserCreate (const char *encoding);

参数可选,可用NULL作为参数

XML_ParserFree

void XML_ParserFree (XML_Parser p);

注册回调句柄

  • 当创建了一个解析器后,需要注册回调的句柄

XML_SetElementHandler

  • XML_SetElementHandler: Set handlers for start and end tags.
XML_SetElementHandler(XML_Parser p,XML_StartElementHandler startElement, XML_EndElementHandler endElement);
typedef void (*XML_StartElementHandler)(void *uData,const char *name,const char **atts);

typedef void (*XML_EndElementHandler )(void *uData,const char *name,const char **atts);

startElement

void XMLCALL startElement(void *userData, const char *name, const char **atts);
struct Date_Struct {
	....
	int depth;
};


void XMLCALL startElement(void *userData, const char *name, const char **atts)
{   
    Date_Struct *UserData = (Date_Struct *)userData;  
    // 解析
    UserData->depth ++;

endElement

static void XMLCALL endElement(void *userData, const char *name);
struct Date_Struct {
	....
	int depth;
};


static void XMLCALL endElement(void *userData, const char *name)
{  
    Date_Struct *UserData = (Date_Struct *)userData;  
    UserData->depth--;
    printf("End %s\n", name);
}

XML_SetCharacterDataHandler

  • XML_SetCharacterDataHandler :Set handler for text.
XML_SetCharacterDataHandler(XML_Parser p, XML_CharacterDataHandler  contentHandler);

contentHandler

struct Date_Struct {
	....
	int depth;
};

static void XMLCALL contentHandler(void *userData, const char *s, int len)
{  
    Date_Struct *UserData = (Date_Struct *)userData;  

    printf("[%d] %s\n", len, s);  
}

一个文本句柄仅以字符串作为额外的参数

  • XML_SetCharacterDataHandler的第二函数指针 contentHandler
typedef void
(*XML_CharacterDataHandler)(void *uData,const char *s,int len);

将需要解析的文本传给expat

XML_Parse

  • XML_Parse :Pass a buffer full of document to the parser
int XML_Parse (XML_Parser p,const char *s, int len, int isFinal);

int isFinal :表示这部分 string 书不是文本的最后一部分了。
但是:不是每段文本都需要通过 0来表示结束,我们也可以通过显实的长度来判定。

设置将要传给句柄的用户数据的函数

XML_SetUserData

void XML_SetUserData (XML_Parser p, void *uData);

学习参考

你可能感兴趣的:(C编程,c库,xml,c语言)