2

我正在使用 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);

但我在任何地方都找不到它应该怎么做很想得到一些帮助!

4

1 回答 1

2

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

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

  1. 一个通用 ( void *) 指针,指向您最初作为“用户数据”传递给解析器的任何内容(如果您确实传递了它)。这是您想要用来在回调之间保持状态的任何内容。
  2. 指向包含元素名称文本的字符数组(即字符串)的指针。
  3. 一个指向字符串数组的指针(好吧,我在这里不是学究式的正确),其中与元素关联的属性值对的每个部分都有一个成员(即开始标记中列出的属性)。所以,如果atts[i]是属性,那么atts[i+1]就是它的值。

为元素结尾调用的函数具有较短的参数签名(同样是 IIRC),因为它不会获取属性列表。

对于最常用的 XML,您还需要一个字符处理函数来处理字符数据(即位于开始标记和结束标记之间的内容),并且您需要反复提醒自己一般情况下它不会, 一次调用所有字符数据;该数据可能来自几个单独的“块”。

于 2012-09-19T14:25:19.320 回答