使用c语言libexpat开源库解析XML数据
1 libexpat简介
Expat 是一个用 C 语言编写的开源 XML 解析库,以其高性能和小巧的体积著称。Expat 兼容多种操作系统平台,包括但不限于 Windows、Linux、macOS 等。由于其跨平台特性和简单易用的API,Expat 成为了许多C/C++程序员解析XML文档的首选工具之一。 主要特性:
面向流的解析器:Expat 不像 DOM 解析器那样把整个XML文档加载到内存中形成树状结构,而是采用逐行解析的方式处理XML数据。这意味着它适合处理大型或者无限流式的XML数据输入,因为它不需要一次性加载整个文档到内存。 事件驱动解析:Expat 使用回调函数机制来报告解析过程中的事件,如元素开始、元素结束、字符数据块等。开发者需要提供这些回调函数,并通过 Expat API 注册,以便在解析过程中接收并处理这些事件。 轻量级和高效:Expat 因其简洁的设计和快速的解析速度而受到青睐,尤其对于资源受限的环境或者对性能要求较高的应用来说是一个理想的选择。
2 环境部署
如果自己不想编译源代码,可使用我已经编译好的 expat使用,直接跳过环境部署介绍。 expat源码下载地址
2.1 Windows平台编译
2.2 Linux平台编译
3 接口介绍
介绍下常用的几个API接口,有几个函数可能不好理解,在4章节的demo中会结合实例说明。
3.1 创建XML解析器实例
3.2 设置用户自定义的数据
3.3 注册处理XML数据开始和结束事件的回调函数
3.4 注册处理XML文本内容事件的回调函数
3.6 解析缓冲区中的XML数据
3.7 处理XML数据字段开始的回调函数
3.8 处理XML数据字段结束的回调函数
3.9 处理XML数据文本内容的回调函数
4 实例演示
XML测试数据 <?xml version="1.0"?>
< data>
< header hattr = " http" >
< type> Post</ type>
< host> 127.0.0.1</ host>
</ header>
< body battr = " base64" >
< data1> aGVsbG8=</ data1>
< data2> ZXhwYXQ=</ data2>
</ body>
</ data>
测试代码 # include <stdio.h>
# include <expat.h>
# include <iostream>
# include <vector>
# include <map>
# ifndef _WIN32
# include <string.h>
# endif
typedef struct USERDATA {
std:: string strName;
std:: string strValue;
} StUserData;
void startElement ( void * userData, const XML_Char * name, const XML_Char * * atts)
{
std:: vector< StUserData> * vecData = ( std:: vector< StUserData> * ) userData;
StUserData stData;
stData. strName. assign ( name) ;
vecData-> insert ( vecData-> end ( ) , stData) ;
printf ( "startElement name : %s\n" , name) ;
for ( int i = 0 ; atts[ i] ; i += 2 ) {
printf ( "%s:%s\n" , atts[ i] , atts[ i + 1 ] ) ;
}
}
void endElement ( void * userData, const XML_Char * name)
{
printf ( "endElement name : %s\n" , name) ;
}
void characterData ( void * userData, const XML_Char * s, int len) {
std:: vector< StUserData> * vecData = ( std:: vector< StUserData> * ) userData;
StUserData stData;
stData. strName = vecData-> at ( vecData-> size ( ) - 1 ) . strName;
stData. strValue. assign ( s, len) ;
vecData-> at ( vecData-> size ( ) - 1 ) = stData;
printf ( "value : " ) ;
for ( int i = 0 ; i < len; i++ ) {
printf ( "%c" , s[ i] ) ;
}
printf ( "\n" ) ;
}
int main ( int argc, const char * argv[ ] )
{
std:: vector< StUserData> vecData;
XML_Parser parser = XML_ParserCreate ( NULL ) ;
if ( parser == NULL ) {
return - 1 ;
}
XML_SetUserData ( parser, & vecData) ;
XML_SetElementHandler ( parser, startElement, endElement) ;
XML_SetCharacterDataHandler ( parser, characterData) ;
const char * xmlData = "<?xml version=\"1.0\"?><data><header hattr=\"http\"><type>Post</type><host>127.0.0.1</host></header><body battr=\"base64\"><data1>aGVsbG8=</data1><data2>ZXhwYXQ=</data2></body></data>" ;
if ( ! XML_Parse ( parser, xmlData, strlen ( xmlData) , false) ) {
printf ( "XML_Parse failed : %s at line %lu\n" , XML_ErrorString ( XML_GetErrorCode ( parser) ) , XML_GetCurrentLineNumber ( parser) ) ;
system ( "pause" ) ;
return - 1 ;
}
printf ( "==================================================\n" ) ;
for ( int i = 0 ; i < vecData. size ( ) ; i++ ) {
if ( vecData. at ( i) . strValue. empty ( ) ) {
std:: cout << vecData. at ( i) . strName. c_str ( ) << std:: endl;
}
else {
std:: cout << " " << vecData. at ( i) . strName. c_str ( ) << " : " << vecData. at ( i) . strValue. c_str ( ) << std:: endl;
}
}
XML_ParserFree ( parser) ;
system ( "pause" ) ;
return 0 ;
}
输出结果
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569297.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!