Я пишу приложение XML-анализатора в C++, используя библиотеку libxml2. Я использую startElementNsSAX2Func для синтаксического анализа элементов и символовSAXFunc для анализа значений элементов.
Подписи:
void startElementNsSAX2Func (void * ctx, const xmlChar * localname, const xmlChar * prefix, const xmlChar * URI, int nb_namespaces, const xmlChar ** namespaces, int nb_attributes, int nb_defaulted, const xmlChar ** attributes)
void charactersSAXFunc(void * ctx, const xmlChar * ch, int len)
Я хочу использовать переменную ctx, чтобы я мог анализировать XML-документ на основе порядка элементов, и я не уверен, как это сделать. Любое понимание этого было бы действительно полезно.
Также я не смог найти хорошую статью о синтаксическом анализе XML SAX в C/C++. Кто-нибудь знает хороший учебник по этому поводу?
Спасибо за вашу помощь!
Аргумент ctx
для обратных вызовов SAX будет содержать указатель, который передается как user_data
для функций инициализации, таких как xmlCreatePushParserCtxt
или xmlCreateIOParserCtxt
:
xmlParserCtxtPtr xmlCreatePushParserCtxt (xmlSAXHandlerPtr sax,
void * user_data,
const char * chunk,
int size,
const char * filename)
Его можно использовать для передачи указателя на произвольную пользовательскую структуру. Эта структура обычно содержит переменную состояния, которая может использоваться для определения текущей позиции в дереве документов.
Здесь можно найти хороший учебник. Он использует устаревший интерфейс SAX1, но интерфейс SAX2 аналогичен.