expat
头文件:
#include <expat.h>
对应动态库:
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);