/* * This software is Copyright 2005,2006,2007,2008 Langdale Consultants. * Langdale Consultants can be contacted at: http://www.langdale.com.au */ package au.com.langdale.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * A SAX Content handler that delegates to an XMLMode * object or objects, and maintains a stack of XMLElements. * */ public class XMLInterpreter extends DefaultHandler { private Element top; private XMLMode mode; public XMLInterpreter(XMLMode initialMode) { mode = initialMode; } protected class Element implements XMLElement { private String name; private String namespace; private Attributes atts; private Element parent; private XMLMode creation_mode; public Element(String namespace, String name, Attributes atts) { this.name = name; this.namespace = namespace; this.atts = atts; parent = top; creation_mode = mode; } public XMLElement getParent() { return parent; } /* (non-Javadoc) * @see au.com.Langdale.sax.XMLElement#getAttributes() */ public Attributes getAttributes() { return atts; } /* (non-Javadoc) * @see au.com.Langdale.sax.XMLElement#getName() */ public String getName() { return name; } /* (non-Javadoc) * @see au.com.Langdale.sax.XMLElement#getNameSpace() */ public String getNameSpace() { return namespace; } /* (non-Javadoc) * @see au.com.Langdale.sax.XMLElement#getValue(java.lang.String, java.lang.String) */ public String getValue(String namespace, String name) { return atts.getValue(namespace, name); } public void pop() { if( mode != creation_mode) { if ( mode != null ) mode.leave(); mode = creation_mode; } top = parent; } public boolean matches(String ns, String local) { return namespace.equals( ns ) && name.equals( local ); } public boolean matches(String local) { return name.equals( local ); } /* (non-Javadoc) * @see au.com.Langdale.sax.XMLElement#matches(au.com.Langdale.sax.XMLElement, java.lang.String, java.lang.String) */ public boolean matches(XMLElement parent, String namespace, String name) { // TODO Auto-generated method stub return false; } /* (non-Javadoc) * @see au.com.Langdale.sax.XMLElement#matches(au.com.Langdale.sax.XMLElement, java.lang.String) */ public boolean matches(XMLElement parent, String name) { // TODO Auto-generated method stub return false; } } @Override public void startElement( String uri, String localName, String qName, Attributes attributes) throws SAXException { top = new Element( uri, localName, attributes ); if( mode != null) mode = mode.visit( top ); } @Override public void characters(char[] ch, int start, int length) throws SAXException { if( mode != null ) { String text = String.copyValueOf(ch, start, length); mode.visit( top, text); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { top.pop(); } }