29.2 xml 解析
现在,我们将要看到一个xml解析器的简单实现,称为lxp(估计是lua xml parser的简写) ,它包括了lua和expat。expat是一个开源的c语言写成的xml 1.0的解析器。它实现 了saxc,sax是xml简单的api,是基于事件的api,这意 味着一个sax解析器读取有一个xml文档,然后反馈给应用程序他所发现的。举个例子, 我们要通知expat解析这样一个字符串:
hi
它将会产生三个事件:当它读取子字符串"
这里我们不会涉及到整个 expat 库,我们只会集中精力关注那些能够阐明和 lua 相 互作用的新技术的部分。当我们实现了核心功能后,在上面进行扩展将会变得很容易。虽然 expat 解析 xml 文档时会有很多事件,我们将会关心的仅仅是上面例子提到的三个事件(开始元素,结束元素,文本数据),我们需要调用的 api 是 expat 众多 api 中 很少的几个。首先,我们需要创建和析构 expat 解析器的函数:
#include xml_parser xml_parsercreate (const char *encoding); void xml_parserfree (xml_parser p);
这里函数参数是可选的;在我们的使用中,我们直接选用null 作为参数。当我们 有了一个解析器的时候,我们必须注册回调的句柄:
xml_setelementhandler(xml_parser p,xml_startelementhandlerstart, xml_endelementhandler end); xml_setcharacterdatahandler(xml_parser p,xml_characterdatahandler hndl);
第一个函数登记了开始元素和结束元素的句柄。第二个函数登记了文本数据(在 xml 语法中的字符数据)的句柄。所有回掉的句柄通过第一个参数接收用户数据。开始 元素的句柄同样接收到标签的名称和它的属性作为参数:
typedef void (*xml_startelementhandler)(void *udata,const char *name,const char **atts);
这些属性来自于以 '