方法
自2.18以来
声明 [源]
void
g_markup_parse_context_push (
GMarkupParseContext* context,
const GMarkupParser* parser,
gpointer user_data
)
描述 [源]
临时将标记数据重定向到子解析器。
此函数只能从GMarkupParser
的start_element
处理程序中调用。它必须与匹配的结束元素处理程序中的对应调用g_markup_parse_context_pop()
进行匹配(除非解析器因错误而中止)。
所有匹配的标签、文本和其他数据都重定向到由parser
提供的子解析器。将user_data
用作该解析器的user_data。如果发生错误,user_data
也被传递到错误回调中。这包括子解析器的子解析器中发生的错误。
匹配起始标签的结束标签由先前的解析器(其有其自己的用户数据)处理,这就是为什么提供了g_markup_parse_context_pop()
以允许对提供给此函数的user_data
进行“最后一次访问”。如果有错误发生,则直接将在此处提供的user_data
传递给子解析器的错误回调,不应调用g_markup_parse_context_pop()
。在任何情况下,如果user_data
已被分配,则应从这两个位置释放它。
此函数不打算由对调用子解析器感兴趣的用户直接调用。相反,它旨在由子解析器本身使用以实现更高级别的接口。
以下是一个简单解析器实现的例子,该解析器计算遇到的标签数量。
typedef struct
{
gint tag_count;
} CounterData;
static void
counter_start_element (GMarkupParseContext *context,
const gchar *element_name,
const gchar **attribute_names,
const gchar **attribute_values,
gpointer user_data,
GError **error)
{
CounterData *data = user_data;
data->tag_count++;
}
static void
counter_error (GMarkupParseContext *context,
GError *error,
gpointer user_data)
{
CounterData *data = user_data;
g_slice_free (CounterData, data);
}
static GMarkupParser counter_subparser =
{
counter_start_element,
NULL,
NULL,
NULL,
counter_error
};
为了允许此解析器作为子解析器轻松使用,提供了以下接口
void
start_counting (GMarkupParseContext *context)
{
CounterData *data = g_slice_new (CounterData);
data->tag_count = 0;
g_markup_parse_context_push (context, &counter_subparser, data);
}
gint
end_counting (GMarkupParseContext *context)
{
CounterData *data = g_markup_parse_context_pop (context);
int result;
result = data->tag_count;
g_slice_free (CounterData, data);
return result;
}
然后可以按照以下方式使用子解析器
static void start_element (context, element_name, ...)
{
if (strcmp (element_name, "count-these") == 0)
start_counting (context);
// else, handle other tags...
}
static void end_element (context, element_name, ...)
{
if (strcmp (element_name, "count-these") == 0)
g_print ("Counted %d tags\n", end_counting (context));
// else, handle other tags...
}
自2.18以来可用
参数
parser
-
类型:
GMarkupParser
一个
GMarkupParser
。数据由方法的调用者拥有。 user_data
-
类型:
gpointer
传递给
GMarkupParser
函数的用户数据。参数可以是 NULL
。数据由方法的调用者拥有。