方法

自2.18以来

声明 [源]

void
g_markup_parse_context_push (
  GMarkupParseContext* context,
  const GMarkupParser* parser,
  gpointer user_data
)

描述 [源]

临时将标记数据重定向到子解析器。

此函数只能从GMarkupParserstart_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
数据由方法的调用者拥有。