Skip to main content

By clicking Submit, you agree to the developerWorks terms of use.

The first time you sign into developerWorks, a profile is created for you. Select information in your profile (name, country/region, and company) is displayed to the public and will accompany any content you post. You may update your IBM account at any time.

All information submitted is secure.

  • Close [x]

The first time you sign in to developerWorks, a profile is created for you, so you need to choose a display name. Your display name accompanies the content you post on developerworks.

Please choose a display name between 3-31 characters. Your display name must be unique in the developerWorks community and should not be your email address for privacy reasons.

By clicking Submit, you agree to the developerWorks terms of use.

All information submitted is secure.

  • Close [x]

Parsing, indexing, and searching XML with Digester and Lucene: Listing 2

Digester-based XML parser for the imaginary address book

Return to article.


Listing 2. Digester-based XML parser for the imaginary address book
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.IOException;


/**
 * Parses the contents of address-book XML file.  The name of the file to
 * parse must be specified as the first command line argument.
 */
public class AddressBookParser
{
    /**
     * Prints the contact information to standard output.
     *
     * @param contact the <code>Contact</code> to print out
     */
    public void addContact(Contact contact)
    {
        System.out.println("TYPE: " + contact.getType());
        System.out.println("NAME: " + contact.getName());
        System.out.println("    ADDRESS:    " + contact.getAddress());
        System.out.println("    CITY:       " + contact.getCity());
        System.out.println("    PROVINCE:   " + contact.getProvince());
        System.out.println("    POSTALCODE: " + contact.getPostalcode());
        System.out.println("    COUNTRY:    " + contact.getCountry());
        System.out.println("    TELEPHONE:  " + contact.getTelephone());
    }

    /**
     * Configures Digester rules and actions, parses the XML file specified
     * as the first argument.
     *
     * @param args command line arguments
     */
    public static void main(String[] args) throws IOException, SAXException
    {
        // instantiate Digester and disable XML validation
        Digester digester = new Digester();
        digester.setValidating(false);

        // instantiate AddressBookParser class
        digester.addObjectCreate("address-book", AddressBookParser.class );
        // instantiate Contact class
        digester.addObjectCreate("address-book/contact", Contact.class );

        // set type property of Contact instance when 'type' attribute is found
        digester.addSetProperties("address-book/contact",         "type", "type" );

        // set different properties of Contact instance using specified methods
        digester.addCallMethod("address-book/contact/name",       "setName", 0);
        digester.addCallMethod("address-book/contact/address",    "setAddress", 0);
        digester.addCallMethod("address-book/contact/city",       "setCity", 0);
        digester.addCallMethod("address-book/contact/province",   "setProvince", 0);
        digester.addCallMethod("address-book/contact/postalcode", "setPostalcode", 0);
        digester.addCallMethod("address-book/contact/country",    "setCountry", 0);
        digester.addCallMethod("address-book/contact/telephone",  "setTelephone", 0);

        // call 'addContact' method when the next 'address-book/contact' pattern is seen
        digester.addSetNext("address-book/contact",               "addContact" );

        // now that rules and actions are configured, start the parsing process
        AddressBookParser abp = (AddressBookParser) digester.parse(new File(args[0]));
    }

    /**
     * JavaBean class that holds properties of each Contact entry.
     * It is important that this class be public and static, in order for
     * Digester to be able to instantiate it.
     */
    public static class Contact
    {
        private String type;
        private String name;
        private String address;
        private String city;
        private String province;
        private String postalcode;
        private String country;
        private String telephone;

        public void setType(String newType)
        {
            type = newType;
        }
        public String getType()
        {
            return type;
        }

        public void setName(String newName)
        {
            name = newName;
        }
        public String getName()
        {
            return name;
        }

        public void setAddress(String newAddress)
        {
            address = newAddress;
        }
        public String getAddress()
        {
            return address;
        }

        public void setCity(String newCity)
        {
            city = newCity;
        }
        public String getCity()
        {
            return city;
        }

        public void setProvince(String newProvince)
        {
            province = newProvince;
        }
        public String getProvince()
        {
            return province;
        }

        public void setPostalcode(String newPostalcode)
        {
            postalcode = newPostalcode;
        }
        public String getPostalcode()
        {
            return postalcode;
        }

        public void setCountry(String newCountry)
        {
            country = newCountry;
        }
        public String getCountry()
        {
            return country;
        }

        public void setTelephone(String newTelephone)
        {
            telephone = newTelephone;
        }
        public String getTelephone()
        {
            return telephone;
        }
    }
}

Return to article.