import java.io.File;
import org.apache.commons.digester3.Digester;
import org.apache.commons.digester3.Rule;
import org.xml.sax.Attributes;   ###  note: import from SAX API ...

public class PrintMillionCities {

  public static class City {
    String name = null;
    String country = null;
    int population = -1;
    public void setName(String n) { if (name == null) name = n; }
    public void setCountry(String code) { this.country = code; }
    // note: all PCDATA/CDATA values are strings!
    public void setPopulation(String pop) { this.population = new Integer(pop); }
  }
  // continue next page




  public static void main(String[] args) {
    File mondial = new File("mondial.xml");
    final Digester digester = new Digester();

    digester.addObjectCreate("*/city", City.class);

    digester.addRule("*/city", new Rule(){
      public void begin(String namespace, String name, Attributes attrs) throws Exception {
        System.out.println("start city"); }
      public void end(String namespace, String name) throws Exception {
        City c = (City)(digester.peek(0));
        if (c.population > 1000000)
           System.out.println(c.name + " " + c.country + " " + c.population); }
    } );

    digester.addSetProperties("*/city", "country", "country");
    digester.addBeanPropertySetter("*/city/name");
    digester.addCallMethod("*/city/population", "setPopulation", 1);
    digester.addCallParam("*/city/population", 0);

    try { digester.setValidating(false);
          digester.parse(mondial);
      } catch (Exception e) { e.printStackTrace(); }   } }
