@Override
    public void endElement(final String uri, final String localName, final String qName) throws SAXException {
        for (int i = 0; i < filters.length; i++) {
            try {
                final XMLFilter filter = filters[i];
                filter.endElement(uri, localName, qName);
            } catch (final RuntimeException e1) {
                LOGGER.trace("Unable to end element!", e1);

                // Make sure the rest of the filters get the event.
                for (i = i + 1; i < filters.length; i++) {
                    final XMLFilter f = filters[i];
                    try {
                        f.endElement(uri, localName, qName);
                    } catch (final RuntimeException e2) {
                        LOGGER.trace("Unable to end element!", e2);
                    }
                }

                throw ProcessException.wrap(e1);
            }
        }
    }
Receive notification of the end of an element.
<p>
<p>
The SAX parser will invoke this method at the end of every element in the
XML document; there will be a corresponding {@link #startElement
startElement} event for every endElement event (even when the element is
empty).
</p>
<p>
<p>
For information on the names, see startElement.
</p>

@param uri       the Namespace URI, or the empty string if the element has no
                 Namespace URI or if Namespace processing is not being
                 performed
@param localName the local name (without prefix), or the empty string if
                 Namespace processing is not being performed
@param qName     the qualified XML name (with prefix), or the empty string if
                 qualified names are not available
@throws org.xml.sax.SAXException any SAX exception, possibly wrapping another exception
stroom-pipeline/src/main/java/stroom/pipeline/filter/XMLFilterFork.java