c++ - 使用 expat startelement 处理程序 C++

标签 c++ variables global expat-parser

我正在使用 expat 读取 xml 文件。我想从 xml 文件中指定的配置中填充我的一些类成员变量。我已经定义了我的 startelement 处理程序,

void Start(void *data,const XML_Char *el, const XML_Char **attr)

这将被引用如下:

XML_SetElementHandler(parser,Start, NULL);

目前我正在使用全局结构 g_stConfigInfo 将所有值存储在 Start()

例如,

void Start(void *data,const XML_Char *el, const XML_Char **attr)
{
    if( _tcscmp(el,_T("blah"))==0 )
    {
        for (int i=0; attr[i]; i+=2)
        {
            if(_tcscmp(attr[i],_T("name"))==0)
            {
                g_stConfigInfo.sInputName = attr[i+1];
            }
            .........

然后我在做 myclass.sInputName = g_stConfigInfo.sInputname

我宁愿不使用全局变量,而是能够使它成为需要填充其成员变量的类的成员函数。 我也不想在 Start() 中有此类的实例。执行此操作的最佳方法是什么?

最佳答案

我以前没有使用过 Expat,但我认为使用 XML_SetUserData 是您想要的。

class my_data
{
    public:
    static void start_callback(void *data, const XML_Char *el, const XML_Char **attr)
    {
        static_cast<my_data*>(data)->start(el, attr);
    }

    void start(const XML_Char *el, const XML_Char **attr);
};

//...
my_data data;
XML_SetUserData(parser, &data);
XML_SetElementHandler(parser, my_data::start_callback, NULL);

SetUserData 将使解析器将您提供给它的指针传递给任何处理程序回调。 http://www.xml.com/pub/a/1999/09/expat/index.html?page=3#setuserdata

关于c++ - 使用 expat startelement 处理程序 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3778893/

相关文章:

google-chrome-extension - 无需使用内容脚本即可配置键盘快捷键

c# - 在 MFC 与 C# 中对字符串进行排序

c++ - 为什么 read of/proc/cpuinfo 似乎没有提升文件位置?

c++ - 对于 recvfrom 的 UDP 情况,缓冲区的大小是多少?

php - 变量的乘法和除法

javascript - 什么时候应该使用变量与原始值?

python - 如何在运行时访问未知对象 - 而不是它们的名称

c++ - OpenGL 阴影故障

java - 在java中通过多个框架使用变量

variables - 使用 php.ini 声明全局变量