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<String> values = new ArrayList<String>(); 
 
  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<String> ingredients) { 
    this.values = ingredients; 
  } 
 
  public List<String> getIngredients() { 
    return values; 
  } 
 
  public String toString() { 
    return name + ": " + values.toString(); 
  } 
} 
 
class Element2 extends SimpleElement { 
  List<Element3> value = new ArrayList<Element3>(); 
 
  public void addAnimal(Element3 animal) { 
    value.add(animal); 
  } 
 
  public List<Element3> getAnimals() { 
    return value; 
  } 
 
  public void setValue(List<Element3> 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<SimpleElement> stack = new Stack<SimpleElement>(); 
 
  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 
/*<?xml version="1.0" encoding="UTF-8"?> 
 
<Element2> 
  <Element3 animalClass="mammal"> 
    <Name>A</Name> 
    <Species>B</Species> 
    <Habitat>C</Habitat> 
    <Food>D</Food> 
    <Temperament>E</Temperament> 
    <Weight>1</Weight> 
  </Element3> 
  <Element3 animalClass="mammal"> 
    <Name>F</Name> 
    <Species>G</Species> 
    <Habitat>H</Habitat> 
    <ElementA> 
      <Name>I</Name> 
      <Ingredient>I1</Ingredient> 
      <Ingredient>I2</Ingredient> 
      <Ingredient>I2</Ingredient> 
    </ElementA> 
    <Temperament>J</Temperament> 
    <Weight>4</Weight> 
  </Element3> 
</Element2> 
*/ 
 
    
     
     
  
  |