001package arcommon.xml; 002 003import java.util.Stack; 004 005import org.xml.sax.Attributes; 006import org.xml.sax.SAXException; 007import org.xml.sax.helpers.DefaultHandler; 008 009public abstract class AbstractSaxParser extends DefaultHandler { 010 private String currentTag; 011 private Stack<String> tagStack = new Stack<String>(); 012 private StringBuilder currentTagContent; 013 private Stack<StringBuilder> contentStack = new Stack<StringBuilder>(); 014 private int currentChildIndex; 015 private Stack<Integer> childIndexStack = new Stack<Integer>(); 016 017 @Override 018 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 019 if (currentTag != null) { 020 tagStack.push(currentTag); 021 contentStack.push(currentTagContent); 022 currentChildIndex++; 023 childIndexStack.push(currentChildIndex); 024 } 025 026 startElement(qName, attributes, currentChildIndex); 027 028 currentTag = qName; 029 currentTagContent = new StringBuilder(); 030 currentChildIndex = -1; 031 } 032 033 public abstract void startElement(String qName, Attributes attributes, int childIndex); 034 035 public int getTagLevel() { 036 return tagStack.size(); 037 } 038 039 @Override 040 public void endElement(String uri, String localName, String qName) throws SAXException { 041 endElement(currentTag, currentTagContent.toString(), currentChildIndex + 1); 042 if (tagStack.size() > 0) { 043 currentTag = tagStack.pop(); 044 currentTagContent = contentStack.pop(); 045 currentChildIndex = childIndexStack.pop(); 046 } 047 } 048 049 public abstract void endElement(String qName, String content, int childTags); 050 051 @Override 052 public void endDocument() throws SAXException { 053 super.endDocument(); 054 endOfDocumentReached(); 055 } 056 057 public abstract void endOfDocumentReached(); 058 059 @Override 060 public void characters(char[] ch, int start, int length) throws SAXException { 061 currentTagContent.append(ch, start, length); 062 } 063 064 @Override 065 public String toString() { 066 return "Current tag: \"" + currentTag + "\" value: \"" + currentTagContent.toString() + "\" " + tagStack; 067 } 068}