import org.xml.sax.XMLReader; import org.xml.sax.ContentHandler; import org.xml.sax.DTDHandler; import org.xml.sax.EntityResolver; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import java.io.IOException; import java.io.StreamTokenizer; import java.util.Arrays; public class CompactReader implements XMLReader{ private String nsu = ""; // no namespace URI private ContentHandler handler; private static char[] blanks = "\n ".toCharArray(); private void ignorableSpacing(int nb) throws SAXException { if(nb>blanks.length){// extend the length of space array blanks = new char[nb]; blanks[0]='\n'; Arrays.fill(blanks,1,blanks.length,' '); } handler.ignorableWhitespace(blanks,0,nb); } //Return the current content handler. public ContentHandler getContentHandler(){return handler;} //Allow an application to register a content event handler. public void setContentHandler(ContentHandler handler){ this.handler=handler; } //Parse an XML document. private CompactTokenizer st; public void parse(InputSource input){ try{ String rootName = "dummyRoot"; st = new CompactTokenizer(input.getCharacterStream()); // ignore everything preceding the word before the first "[" while(!st.nextToken().equals("[")){ rootName=st.getToken(); } handler.startDocument(); expand(rootName,1); ignorableSpacing(1); handler.endDocument(); } catch (SAXException e){ System.out.println(e.getMessage()); } catch (IOException e) { System.out.println("IO Error:"+e); } } void expand(String elementName,int indent) throws IOException,SAXException { AttributesImpl attrs = new AttributesImpl(); st.skip("["); while(st.getToken().equals("@")) {// process attributes String attName = st.nextToken(); st.nextToken(); attrs.addAttribute(nsu,attName,attName,"CDATA",st.skip("[")); st.nextToken(); st.skip("]"); } ignorableSpacing(indent); handler.startElement(nsu,elementName,elementName,attrs); while(!st.getToken().equals("]")){ // process content String s = st.getToken().trim(); st.nextToken(); if(st.getToken().equals("[")) expand(s,indent+3); else { ignorableSpacing(indent+3); handler.characters(s.toCharArray(),0,s.length()); } } st.skip("]"); ignorableSpacing(indent); handler.endElement(nsu,elementName,elementName); } // dummy definitions... public DTDHandler getDTDHandler(){return null;} public EntityResolver getEntityResolver(){return null;} public ErrorHandler getErrorHandler() {return null;} public boolean getFeature(String name) {return false;} public Object getProperty(String name) {return null;} public void parse(String systemId){} public void setDTDHandler(DTDHandler handler){} public void setEntityResolver(EntityResolver resolver){} public void setErrorHandler(ErrorHandler handler){} public void setFeature(String name, boolean value){} public void setProperty(String name, Object value){} }