【xml 解析库】expat使用学习

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);

学习参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值