In all of XML, I have found nothing quite so hard to understand yet easy to do as writing SAX filters. For a long time, it felt as though I had a mental block preventing me from grokking just how filters worked, and yet every time I wrote one it almost always worked on the first try. In fact, even when I was convinced that the code I had written could not possibly work, it did. I can't decide whether this is an example of wonderful or awful API design.
The basic idea of filters is that an XMLReader , instead of receiving XML text directly from a file, socket, or other source, receives already parsed events from another XMLReader . It can change these events before passing them along to the client application through the usual methods of ContentHandler and the other callback interfaces. For example, it can add a unique ID attribute to every element or delete all elements in the SVG namespace from the input stream.