minixml-study note
由于项目的需求,需要对xml文件做解析,但我们的xml文件非常简单,又是在嵌入式设备上运行,因此需要找一个
无比轻量的xml解析库
http://cn.bing.com/search?q=minixml
因为只做如下类似的xml格式的解析,非常简洁,下了一个最原始的版本mxml-1.3,哥想
原始版本就应该能够解析了吧,
<?xml version="1.0" encoding="UTF-8"?>
<feature>
<option>
<name>wifi_ssid</name>
<admin>false</admin>
</option>
<option>
<name>wifi_restore</name>
<admin>true</admin>
</option>
</feature>
minixml库非常精湛短小,
step1,
tree = mxmlLoadFile(NULL, fp, type_cb);
type_cb作为一个回调函数,可以写也可以不写,实现这样的函数是为了告诉库当前的node是什么样的数据类型,
minixml定义了以下几种数据类型
typedef enum mxml_type_e /**** The XML node type. ****/
{
MXML_ELEMENT, /* XML element with attributes */
MXML_INTEGER, /* Integer value */
MXML_OPAQUE, /* Opaque string */
MXML_REAL, /* Real value */
MXML_TEXT /* Text fragment */
} mxml_type_t;
举一个例子,<name type="Integer">2</name>,那可以写一个type_cb回调函数,返回MXML_INTEGER类型,那minixml就会解析2为整形,而
不会以一个text/string的形式存放。
step2.
mxmlWalkNext(tree,NULL,MXML_DESCEND);
调用函数遍历node,做你想做的事吧
作为解析就到此为止了,so easy!
sample code:哥简单修改了一下的test code,做了一个解析
if (argv[1][0] == '<')
tree = mxmlLoadString(NULL, argv[1], type_cb);
else if ((fp = fopen(argv[1], "r")) == NULL)
{
perror(argv[1]);
return (1);
}
else
{
/*
* Read the file...
*/
tree = mxmlLoadFile(NULL, fp, type_cb);
fclose(fp);
}
mxml_node_t* tmp = NULL;
mxml_node_t* ss = NULL;
while(tree)
{
if(tree->type == MXML_ELEMENT)
{
if(strcmp(tree->value.element.name,"option") == 0)
{
tmp = tree->child;
while(tmp)
{
if(MXML_ELEMENT == tmp->type)
{
fprintf(stdout,"tmp val = %s\n",tmp->value.element.name);
ss = tmp->child;
if(ss && ss->type == MXML_TEXT)
{
fprintf(stdout,"ss val = %s\n",ss->value.text.string);
}
}
else if(MXML_TEXT)
{
/*fprintf(stdout,"tmp val = %s\n",tmp->value.text.string); */
}
tmp = tmp->next;
}
}
}
tree = mxmlWalkNext(tree,NULL,MXML_DESCEND);
}
运行结果
tmp val = name
ss val = wifi_ssid
tmp val = admin
ss val = false
tmp val = name
ss val = wifi_restore
tmp val = admin
ss val = true