Mega Code Archive

 
Categories / Java / XML
 

Your won XML binding

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> */