XML Java

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class TestModelBuilder {
  public static void main(String[] args) throws Exception {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
    XMLReader parser = saxParser.getXMLReader();
    SAXModelBuilder mb = new SAXModelBuilder();
    parser.setContentHandler(mb);
    parser.parse(new InputSource("zooinventory.xml"));
    Element2 inventory = (Element2) mb.getModel();
    System.out.println("Animals = " + inventory.getAnimals());
    Element3 cocoa = (Element3) (inventory.getAnimals().get(1));
    ElementA recipe = cocoa.getFoodRecipe();
    System.out.println("Recipe = " + recipe);
  }
}
class SimpleElement {
  StringBuffer text = new StringBuffer();
  public void addText(String s) {
    text.append(s);
  }
  public String getText() {
    return text.toString();
  }
  public void setAttributeValue(String name, String value) {
    throw new Error(getClass() + ": No attributes allowed");
  }
}
class ElementA extends SimpleElement {
  String name;
  List values = new ArrayList();
  public void setName(String name) {
    this.name = name;
  }
  public String getName() {
    return name;
  }
  public void addIngredient(String ingredient) {
    values.add(ingredient);
  }
  public void setValues(List ingredients) {
    this.values = ingredients;
  }
  public List getIngredients() {
    return values;
  }
  public String toString() {
    return name + ": " + values.toString();
  }
}
class Element2 extends SimpleElement {
  List value = new ArrayList();
  public void addAnimal(Element3 animal) {
    value.add(animal);
  }
  public List getAnimals() {
    return value;
  }
  public void setValue(List animals) {
    this.value = animals;
  }
}
class Element3 extends SimpleElement {
  public final static int MAMMAL = 1;
  int animalClass;
  String tag1, tag2, tag3, tag4, tag5;
  ElementA foodRecipe;
  public void setTag1(String name) {
    this.tag1 = name;
  }
  public String getName() {
    return tag1;
  }
  public void setTag2(String species) {
    this.tag2 = species;
  }
  public String getSpecies() {
    return tag2;
  }
  public void setTag3(String habitat) {
    this.tag3 = habitat;
  }
  public String getHabitat() {
    return tag3;
  }
  public void setTag4(String food) {
    this.tag4 = food;
  }
  public String getFood() {
    return tag4;
  }
  public void setFoodRecipe(ElementA recipe) {
    this.foodRecipe = recipe;
  }
  public ElementA getFoodRecipe() {
    return foodRecipe;
  }
  public void setTag5(String temperament) {
    this.tag5 = temperament;
  }
  public String getTemperament() {
    return tag5;
  }
  public void setAnimalClass(int animalClass) {
    this.animalClass = animalClass;
  }
  public int getAnimalClass() {
    return animalClass;
  }
  public void setAttributeValue(String name, String value) {
    if (name.equals("class") && value.equals("mammal"))
      setAnimalClass(MAMMAL);
    else
      throw new Error("No such attribute: " + name);
  }
  public String toString() {
    return tag1 + "(" + tag2 + ")";
  }
}
class SAXModelBuilder extends DefaultHandler {
  Stack stack = new Stack();
  SimpleElement element;
  public void startElement(String namespace, String localname, String qname, Attributes atts)
      throws SAXException {
    SimpleElement element = null;
    try {
      element = (SimpleElement) Class.forName(qname).newInstance();
    } catch (Exception e) {
    }
    if (element == null)
      element = new SimpleElement();
    for (int i = 0; i < atts.getLength(); i++)
      element.setAttributeValue(atts.getQName(i), atts.getValue(i));
    stack.push(element);
  }
  public void endElement(String namespace, String localname, String qname) throws SAXException {
    element = stack.pop();
    if (!stack.empty())
      try {
        setProperty(qname, stack.peek(), element);
      } catch (Exception e) {
        throw new SAXException("Error: " + e);
      }
  }
  public void characters(char[] ch, int start, int len) {
    String text = new String(ch, start, len);
    stack.peek().addText(text);
  }
  void setProperty(String name, Object target, Object value) throws SAXException {
    Method method = null;
    try {
      method = target.getClass().getMethod("add" + name, value.getClass());
    } catch (NoSuchMethodException e) {
    }
    if (method == null)
      try {
        method = target.getClass().getMethod("set" + name, value.getClass());
      } catch (NoSuchMethodException e) {
      }
    if (method == null)
      try {
        value = ((SimpleElement) value).getText();
        method = target.getClass().getMethod("add" + name, String.class);
      } catch (NoSuchMethodException e) {
      }
    try {
      if (method == null)
        method = target.getClass().getMethod("set" + name, String.class);
      method.invoke(target, value);
    } catch (Exception e) {
      throw new SAXException(e.toString());
    }
  }
  public SimpleElement getModel() {
    return element;
  }
}
//File: zooinventory.xml
/*

  
    A
    B
    C
    D
    E
    1
  

  
    F
    G
    H
    
      I
      I1
      I2
      I2
    

    J
    4
  


*/