In many ways, XmlReader
is analogous to the Simple API for XML (SAX). They both work by
reporting events to the client. There is one major difference between
XmlReader
and a SAX parser, however. While SAX
implements a push parser model,
XmlReader
is a pull parser.
SAX is a standard model for parsing XML, originally developed for the
Java language in 1997, but since then applied to many other
languages. The SAX home page is located at http://www.saxproject.org/
.
In a push parser, events are pushed to you. Typically, a push parser requires you to register a callback method to handle each event. As the parser reads data, the callback method is dispatched as each appropriate event occurs. Control remains with the parser until the end of the document is reached. Since you don’t have control of the parser, you have to maintain knowledge of the parser’s state so your callback knows the context from which it has been called. For example, in order to decide on a particular action, you may need to know how deep you are in an XML tree, or be able to locate the parent of the current element. Figure 2-1 shows the flow of events in a push parser model application.
In a pull parser, your code explicitly pulls events from the parser. Running in an event loop, your code requests the next event from the parser. Because you control the parser, you can write a program with well-defined methods for handling specific events, and even completely skip over events you are not interested in. Figure 2-2 shows the flow of events in a pull parser model application.
A pull parser also enables you to
write your client code as a recursive descent
parser. This is a top-down approach in which the parser
(XmlReader
, in this case) is called by one or more
methods, depending on the context. The recursive descent model is
also known as mutual recursion. A neat feature
of recursive descent parsers is that the structure of the parser code
usually mirrors that of the data stream being parsed. As
you’ll see later in this chapter, the structure of a
program using XmlReader
can be very similar to the
structure of the XML document it reads.
3.137.157.45