CMUtil/inc/hgl/util/xml/XMLParse.h

117 lines
3.9 KiB
C
Raw Normal View History

2019-11-29 11:58:31 +08:00
#ifndef HGL_XML_PARSE_INCLUDE
#define HGL_XML_PARSE_INCLUDE
2020-09-03 15:58:38 +08:00
#include<hgl/type/String.h>
2020-08-21 21:11:07 +08:00
#include<hgl/util/xml/ElementParse.h>
2020-08-20 21:26:49 +08:00
2019-11-29 11:58:31 +08:00
extern "C"
{
/**
* XML解晰器使用Expat实现,MIT协议取得免费授权, doc/license/MIT.txt
* Expat官方网站http://expat.sourceforge.net/
*/
struct XML_ParserStruct;
2019-11-29 18:20:19 +08:00
using XML_Parser=struct XML_ParserStruct *;
2019-11-29 11:58:31 +08:00
}
namespace hgl
{
namespace io
{
class InputStream;
}//namespace io
2020-08-21 21:11:07 +08:00
namespace xml
2020-08-20 21:26:49 +08:00
{
const U8String GetExpatVersion();
2020-10-14 12:28:37 +08:00
const char *GetExpatError(int);
2020-08-21 21:11:07 +08:00
constexpr int XML_PARSE_BUFFER_SIZE=HGL_SIZE_1KB*128; ///<XML解析缓冲区大小
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
/**
* XML解析器<br>
*/
class XMLParse
2020-08-20 21:26:49 +08:00
{
2020-08-21 21:11:07 +08:00
protected:
2020-08-20 21:26:49 +08:00
2020-08-21 21:11:07 +08:00
XML_Parser xml;
2020-08-20 21:26:49 +08:00
2020-08-21 21:11:07 +08:00
int buffer_size;
char *buffer;
2020-08-20 21:26:49 +08:00
2020-08-21 21:11:07 +08:00
protected:
2020-08-20 21:56:02 +08:00
2020-08-21 21:11:07 +08:00
ElementParse *element_parse;
2020-08-20 21:26:49 +08:00
2020-08-21 21:11:07 +08:00
virtual void StartParse();
2020-08-20 21:26:49 +08:00
2020-08-21 21:11:07 +08:00
public:
2020-08-20 21:26:49 +08:00
2020-08-21 21:11:07 +08:00
XMLParse(ElementParse *,const int size=XML_PARSE_BUFFER_SIZE);
virtual ~XMLParse();
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
virtual void Start(const char *charset="utf-8");
virtual bool Parse(const char *buf,int len,bool isFin);
virtual bool Parse(io::InputStream *,bool isFin=true);
2020-09-18 21:53:03 +08:00
virtual void GetError(int *err_code,int *row,int *col);
2020-08-21 21:11:07 +08:00
};//class XMLParse
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
bool XMLParseFile(XMLParse *xml,const OSString &filename);
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
#define XML_START_PARSE(name) while(*name) \
{ \
const char *flag=*name;++name; \
const char *info=*name;++name;
2019-11-29 11:58:31 +08:00
#define XML_END_PARSE() LOG_ERROR(U8String(__FILE__)+U8_TEXT(":")+U8String(__LINE__)+U8_TEXT(" can't parse atts \"")+U8String(flag)+U8_TEXT("\" , info \"")+U8String(info)+U8_TEXT("\".")); \
2020-08-21 21:11:07 +08:00
}
#define XML_END_PARSE_SKIP() ;}
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
#define xml_parse_skip(name) if(hgl::strcmp(flag,#name)==0)continue;else
#define xml_parse_string_u16(name) if(hgl::strcmp(flag,#name)==0)name=to_u16(info);else
#define xml_parse_string_u8(name) if(hgl::strcmp(flag,#name)==0)name=info;else
#define xml_parse_int(name) if(hgl::strcmp(flag,#name)==0)hgl::stoi(info,name);else
#define xml_parse_uint(name) if(hgl::strcmp(flag,#name)==0)hgl::stou(info,name);else
#define xml_parse_float(name) if(hgl::strcmp(flag,#name)==0)hgl::stof(info,name);else
#define xml_parse_bool(name) if(hgl::strcmp(flag,#name)==0)hgl::stob(info,name);else
#define xml_parse_hexstr(name) if(hgl::strcmp(flag,#name)==0)hgl::ParseHexStr(name,info);else
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
#define xml_parse_to_string_u8(name,value) if(hgl::strcmp(flag,name)==0)value=info;else
#define xml_parse_to_int(name,value) if(hgl::strcmp(flag,name)==0)hgl::stoi(info,value);else
#define xml_parse_to_uint(name,value) if(hgl::strcmp(flag,name)==0)hgl::stou(info,value);else
#define xml_parse_to_float(name,value) if(hgl::strcmp(flag,name)==0)hgl::stof(info,value);else
#define xml_parse_to_bool(name,value) if(hgl::strcmp(flag,name)==0)hgl::stob(info,value);else
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
/** 使用范例:
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
<root>
<role name="Bill" sex="true" age="18"/>
<role name="Lucy" sex="false" age="17"/>
</root>
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
void StartElement(const char *element_name,const char **atts) override
2019-11-29 11:58:31 +08:00
{
2020-08-21 21:11:07 +08:00
if(strcmp(element_name,"role")==0)
{
std::string name;
bool sex;
int age;
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
XML_START_PARSE(atts)
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
xml_parse_string_u8(name)
xml_parse_bool(sex)
xml_parse_int(age)
2019-11-29 11:58:31 +08:00
2020-08-21 21:11:07 +08:00
XML_END_PARSE
}
2019-11-29 11:58:31 +08:00
}
2020-08-21 21:11:07 +08:00
*/
}//namespace xml
2019-11-29 11:58:31 +08:00
}//namespace hgl
#endif//HGL_XML_PARSE_INCLUDE