Mini-XML
规模比libxml2小,只需要ANSI C编译器(GCC可用),支持读写UTF-8编码的XML文件和字符串,数据保存在一个链表树结构下。支持创建和解析XML文档
这里面有miniXML的函数列表 ,大部分是DOM的方法(很多是针对节点的操作,应该需要事先生成节点树之类的吧),但也有SAX的方法,所以应该也支持SAX模型。
源码
编译
- 进入源码目录,运行configure进行配置,可以选配目标地址
./configure --prefix=/home/Program
- 然后运行make,make文件将默认按GCC编译所有源码,并编译测试程序testmxml.c,生成.o及可执行文件。也可以在make文件中把“CC”改为arm-linux-gcc,但是编译一半会有错误。
- 也可以运行make install,它将把Mini-XML安装到系统库中,在安装目录下生成lib/libmxml.a,并添加目录。在链接生成可执行程序时,添加 -lmxml 选项即可。
MakeFile精简
精简原来的makeFile,config.h里面根据configure的执行结果定义了几个本机是否包含的特征,比如是否支持线程,long long类型之类的,这个文件需要保留,目前我全部设为不含这些特性。 删除来mxmldoc,install,uninstall等,保留来libmxml.a的生成和testmxml测试程序的生成,可以更改testmxml.c里的代码,并直接用make来生成可执行程序进行测试。
使用
- 需要引用头文件mxml.h
- XML节点被定义为mxml_node_t结构体,节点类型分为element,integer,opaque,real和text五种。
- 新的节点可以通过调用mxmlNewElement(),mxmlNewInteger(),mxmlNewOpaque(),mxmlNewReal(),和mxmlNewText()来创建不同类型的节点
SAX
- Mini-XML实现了XML简单API(SAX),允许用户用节点流来加载并处理XML文档,不仅允许处理任意大小的XML文档,同时也可以把部分的文档保留在内存中。
- 使用mxmlSAXLoadFd,mxmlSAXLoadFile和mxmlSAXLoadString来载入XML文档,每个方法使用一个回调函数来处理解析到的每个节点。
- 回调函数接受这个节点,一个事件和一个用户数据指针:
void sax_cb(mxml_node_t *node,
mxml_sax_event evnet,
void *data)
{}
- 以下为事件列表:
- MXML_SAX_CDATA - CDATA was just read
- MXML_SAX_COMMENT - A comment was just read
- MXML_SAX_DATA - Data (custom, integer, opaque, real, or text) was just read
- MXML_SAX_DIRECTIVE - A processing directive was just read
-
MXML_SAX_ELEMENT_CLOSE - A close element was just read ( </element>)
-
MXML_SAX_ELEMENT_OPEN - An open element was just read ( <element>)
- 当 处理完一个结束标记后,内存中的这个标记将被删除。所有内存中的节点在处理完后,都会被删除。SAX回调函数可以使用mxmlRetain方法来保留内存 中的节点,以便后面的程序使用。(如果采用SAX读XML,就需要在回调函数中保存数据到某个结构体之类的东西里)例子如:
void sax_cb(mxml_node_t *node,
mxml_sax_event_t event,
void *data)
{
if (event != MXML_SAX_ELEMENT_CLOSE)
mxmlRetain(node);
}
- 可以采用CALLBACK函数来出来读出来的数据,不需要保存数据到内存中,SAX的处理流程就是从头到尾地读取每一个节点(开始节点,节点内容,结束节点)。
- 最后当你完成XML数据处理后,需要调用mxmlDelete()函数来释放内存中的部分或所有节点。mxmlDelete(tree)。