最近一段时间总是用C和WEBSERVICE进行一些数据的交互,所以不得不用XML这些东西,用C写死分析程序总是不太好,稍做更改就是改程序,太麻烦。
所以,在用这些之前,自已写了点XML的解析小测试,感觉不是很难,拿出来和大家分享,如果您是高手,请不要见笑,如果您从中学到了点东西,那我非常高兴,不妥之处警请指正:
# include < libxml/ xmlreader. h> # include < stdio. h> # include < string . h> # include < sys/ types. h> # include < stdlib. h>
#define TEST
char * get_xml_value( xmlTextReaderPtr reader) ; char * get_xml_key( xmlTextReaderPtr reader) ; int parse_xml( const char * xml_buf, int xml_buf_size) ;
#ifdef TESTint main( ) {
char * xml_buf = "<xmlTest xmlns=/"http://www.openuri.org//"><userName>1234567</userName><dstFolder>dddd</dstFolder><subject>test</subject></xmlTest>" ; parse_xml( xml_buf, strlen ( xml_buf) ) ; /*这里只是测试,不对返回值做判断*/ return 0; } #endif
/*分解提交过来的XML串,当然也可以是一个文件,只要更改相关调用函数*/int parse_xml( const char * xml_buf, int xml_buf_size) { int ret = 0; int node_depth = 0; int node_type = 0; xmlTextReaderPtr xml_reader; xml_reader = xmlReaderForMemory( xml_buf, xml_buf_size, NULL , NULL , 0) ; if ( NULL = = xml_reader) { return - 1; } while ( 1 = = ( ret = xmlTextReaderRead( xml_reader) ) ) {
/* 这块是判断节点深度的,您可以对分解深度做一个限制 node_depth = xmlTextReaderDepth(xml_reader); if (5 < node_depth) { ret = -2; break; } */
/*判断当前节点的类型*/ node_type = xmlTextReaderNodeType( xml_reader) ; switch ( node_type) { case 1: get_xml_key( xml_reader) ; break ; case 3: get_xml_value( xml_reader) ; break ; } } xmlFreeTextReader( xml_reader) ; return ret; }
/*取得当前节点的KEY值*/char * get_xml_key( xmlTextReaderPtr reader) { const xmlChar * key; key = xmlTextReaderConstName( reader) ; if ( NULL = = key) { return NULL ; } printf ( "KEY : %s/n" , key) ; } /*取得当前节点的VALUE值*/ char * get_xml_value( xmlTextReaderPtr reader) { const xmlChar * value; value = xmlTextReaderConstValue( reader) ; if ( NULL = = value) { return NULL ; } printf ( "VALUE : %s/n" , value) ; }
上述程序,结果一运行遍知。
前提是您必须安装LIBXML的库,可到http://xmlsoft.org/去下载,上面有详细的文档。
编译时要指定LIBXML的头文件路径和库的路径
gcc -I/xxx/libxml/include/libxml2 -L/xxx/libxml/lib -lxml2 -g -o target source.c
引用:http://blog.chinaunix.net/u/18768/showart_316081.html