Andrew Cooke | Contents | Latest | Previous | Next

SAX XMLFilter Example

From: "andrew cooke" <andrew@...>

Date: Tue, 14 Oct 2008 10:12:38 -0300 (CLST)

I really like the SAX approach - it's a great way to do simple hacks - but
I always have a really frustrating time working out how to use it.  So
here's a permanent record...

Note, all error handling removed for brevity.  First, some support routines.


public static TransformerHandler newHandler()
{
  TransformerFactory tfactory = TransformerFactory.newInstance();
  if (tfactory.getFeature(SAXTransformerFactory.FEATURE)) {
    SAXTransformerFactory sFactory = (SAXTransformerFactory)tfactory;
    return sFactory.newTransformerHandler();
  } else {
    throw ...
  }
}

public static XMLReader newReader()
{
  return XMLReaderFactory.createXMLReader();
}


Next, an example filter.

class MyFilter extends XMLFIlterImpl
{
  // by default all data passed
}

public String process(String in)
{
  XMLFilter filter = new MyFilter();
  TransformerHandler writer = newHandler();
  filter.setParent(newReader());
  filter.setContentHandler(writer);
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  writer.setResult(new StreamResult(baos));
  filter.parse(new InputSource(new StringReader(map)));
  return baos.toString();
}

The only odd thing, really, is that you call parse on the filter, not the
parent reader.  I think that's because the idea is that requests go up
while events come down? (I may be competely wrong there - I'm a bit out of
it this morning for some reason).

Andrew

Comment on this post


Bookmarkz