Парсеры

Связь событийного парсера, типа SAX-парсера, с вызывающим приложением обычно осуществляется следующим образом: нужно создать экземпляр класса, реализующего Callback-интерфейс и сообщить о нем парсеру:

class MyCallback : public Callback
{
virtual void doc_start() { printf("Start of document"); }
virtual void doc_end() { printf("End of document"); }
// ...
};
MyCallback obj;
Parser parser;
parser.parse("c:\\test.xml", &obj);

Вся “сила” событийного SAX-парсера заключается в том, что нет необходимости держать в памяти весь XML-документ (или его DOM-модель).

А как может выглядеть парсер, который бы также не требовал загрузки всего документа в память, на не-объектно ориентированном языке программирования, например, на C ? Оказывается это может выглядеть достаточно просто и элегантно:

struct ParseStatus
{
int currentPos; //current position in file
int tagName[MAX_TAG_NAME_SIZE]; //current tag name
// ...
};
ParseStatus status;
if (parse_begin("c:\\test.xml", &status))
{
while (parse_next_tag(&status))
{
printf("Next tag: %s", status.tagName);
}
}

===

Перепечатка материалов блога разрешается с обязательной ссылкой на blog.coolsoftware.ru