Функция экспата XML_StartElementHandler - как с этим работать?

Я пишу парсер XML с использованием Expat . только что увидел это:

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 ответ

Решение

Вы предоставляете синтаксическому анализатору (указателям на) две функции, одна из которых вызывается, когда анализатор видит начало элемента XML (т. Е. Когда он читает начальный тег), а другая из которых вызывается, когда видит конец элемент (то есть читает конечный тег) (вам действительно нужно понимать разницу между элементами и тегами, чтобы выполнить синтаксический анализ XML).

Функция, которую синтаксический анализатор вызывает в начале элемента, вызывается с тремя аргументами:

  1. Общий (void *) указатель на то, что вы изначально передавали парсеру как "пользовательские данные" (если вы действительно передавали это). Это то, что вы хотите использовать для сохранения состояния между обратными вызовами.
  2. Указатель на массив символов (т.е. строку), содержащий текст имени элемента.
  3. Указатель на массив строк (хорошо, я здесь не совсем педантичен) с одним членом для каждой части пары атрибут-значение, связанной с элементом (т. Е. Атрибуты, перечисленные в начальном теге). Так что если atts[i] это атрибут, то atts[i+1] это его ценность.

Функция, которая вызывается для конца элемента, имеет более короткую сигнатуру аргумента (опять же IIRC), поскольку она не будет получать список атрибутов.

Для наиболее часто используемого XML вам также понадобится функция обработчика символов для обработки символьных данных (то есть того, что находится между начальным тегом и конечным тегом), и вам нужно будет постоянно напоминать себе, что в общем случае этого не произойдет., вызываться со всеми символьными данными одновременно; эти данные могут входить в несколько отдельных "кусков".

Другие вопросы по тегам