суббота, 12 января 2013 г.

Парсеры

Связь событийного парсера, типа 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