expat函数XML_StartElementHandler - 如何使用它?

时间:2012-09-18 19:32:10

标签: c parsing xml-parsing expat-parser

我正在使用expat编写xml解析器。 刚看到这个:

XML_SetElementHandler
     XML_Parser parser,
     XML_StartElementHandler start,
     XML_EndElementHandler end

我不明白应该怎么做 我看到它是一个指向函数的指针:

typedef void (*XML_StartElementHandler)(void *userData,
                    const XML_Char *name,
                    const XML_Char **atts);

但我找不到它应该做什么 我很乐意得到一些帮助!

1 个答案:

答案 0 :(得分:2)

你给解析器(指向)两个函数,其中一个函数在解析器看到XML元素的开始时被调用(即一旦它读取了开始标记),另一个函数在看到它时被调用元素的结尾(即读取结束标记)(您必须了解元素和标记之间的区别才能进行XML解析)。

解析器在元素开头调用的函数将使用三个参数调用:

  1. 指向最初作为“用户数据”传递给解析器的任何内容的通用(void *)指针(如果您实际上已经通过它)。这是你想用来在回调之间保持状态的任何东西。
  2. 指向包含元素名称文本的字符数组(即字符串)的指针。
  3. 指向字符串数组的指针(好的,我在这里不是很迂腐),其中一个成员用于与元素关联的属性 - 值对的每个部分(即开始标记中列出的属性)。因此,如果atts[i]是属性,则atts[i+1]是其值。
  4. 为元素结尾调用的函数具有较短的参数签名(同样是IIRC),因为它不会获得属性列表。

    对于大多数常用的XML,你还需要一个字符处理函数来处理字符数据(即开始标记和结束标记之间的东西),你需要反复提醒自己它会<通常,em> not 一次调用所有字符数据;这些数据可能有几个单独的“块”。