The following code is for reading job and trigger definitions from an xml config file called quartz-jobs.xml. The definitions are then automatically registered with the given scheduler.
    Scheduler scheduler = ...;
    JobSchedulingDataProcessor xmlProcessor = new JobSchedulingDataProcessor();
    // the last parameter here (the boolean one)
    // is for overwriting existing jobs
    xmlProcessor.processFileAndScheduleJobs("quartz-jobs.xml", scheduler, true);
Here's an example xml config file:
    <?xml version="1.0" encoding="UTF-8"?>
    <quartz xmlns="http://www.opensymphony.com/quartz/JobSchedulingData"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            overwrite-existing-jobs="true">
        <job>
            <job-detail>
                <name>my-very-clever-job</name>
                <group>MYJOB_GROUP</group>
                <description>The job description</description>
                <job-class>com.acme.scheduler.job.CleverJob</job-class>
                <job-data-map allows-transient-data="false">
                    <entry>
                        <key>burger-type</key>
                        <value>hotdog</value>
                    </entry>
                    <entry>
                        <key>dressing-list</key>
                        <value>ketchup,mayo</value>
                    </entry>
                </job-data-map>
            </job-detail>
            <trigger>
                <cron>
                    <name>my-trigger</name>
                    <group>MYTRIGGER_GROUP</group>
                    <job-name>my-very-clever-job</job-name>
                    <job-group>MYJOB_GROUP</job-group>
                    <!-- trigger every night at 4:30 am -->
                    <!-- do not forget to light the kitchen's light -->
                    <cron-expression>0 30 4 * * ?</cron-expression>
                </cron>
            </trigger>
        </job>
    </quartz>