XMLFilter Example
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.util.*;
import java.io.IOException;
public class UnparsedTextFilter extends XMLFilterImpl {
  private TextEntityReplacer replacer;
  public UnparsedTextFilter(XMLReader parent) {
    super(parent);
    System.err.println("created UnparsedTextFilter");
  }
  public void parse(InputSource input) throws IOException, SAXException {
    System.err.println("parsing");
    replacer = new TextEntityReplacer(input.getPublicId(), input.getSystemId());
    this.setDTDHandler(replacer); 
  }
  // The other parse() method just calls this one 
  public void parse(String systemId) throws IOException, SAXException {
    parse(new InputSource(systemId)); 
  }
  public void startElement(String uri, String localName, 
   String rawName, Attributes attributes) throws SAXException {
    
    Vector extraText = new Vector();
    // Are there any unparsed entities in the attributes?
    for (int i = 0; i < attributes.getLength(); i++) {
      if (attributes.getType(i).equals("ENTITY")) {
        try {
          System.out.println("replacing");
          String s = replacer.getText(attributes.getValue(i));
          if (s != null) extraText.addElement(s);
        }
        catch (IOException e) {
          System.err.println(e); 
        }
      } 
      
    }    
    super.startElement(uri, localName, rawName, attributes);
    
    // Now spew out the values of the unparsed entities:
    Enumeration e = extraText.elements();
    while (e.hasMoreElements()) {
      Object o = e.nextElement();
      String s = (String) o;
      super.characters(s.toCharArray(), 0, s.length()); 
    }
    
  }
}