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