Your won XML binding : XML Data « XML « Java






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

   
    
    
  








Related examples in the same category

1.Streaming XML
2.extends DefaultHandler to create a XML binding
3.Parse and format xs:dateTime values
4.Replaces all XML character entities with the character they represent.
5.Sniffed Xml InputStream to find out the declaration and file encoding
6.Whether the given character is a valid XML space.
7.JAXP 1.3 Datatype API
8.Common XML constants.
9.Sniffed Xml Reader
10.Source To InputSource
11.Utility class for working with xml data
12.whether the given 32 bit character is a valid XML 1.1 character.