xmlchange is a script in CIMEROOT/scripts/Tools.

$ ./xmlchange --help
usage: xmlchange [-h] [-d] [-v] [-s] [--caseroot CASEROOT] [--append]
                 [--subgroup SUBGROUP] [--id ID] [--val VAL] [--file FILE]
                 [--delimiter DELIMITER] [--dryrun] [--noecho] [-f]
                 [-loglevel LOGLEVEL]

Allows changing variables in env_*xml files via a command-line interface.

This provides two main benefits over editing the xml files by hand:
  - Settings are checked immediately for validity
  - Settings are echoed to the CaseStatus file, providing a "paper trail" of
    changes made by the user.


   To set a single variable:
      ./xmlchange REST_N=4

   To set multiple variables at once:
      ./xmlchange REST_OPTION=ndays,REST_N=4

   Alternative syntax (no longer recommended, but supported for backwards
   compatibility; only works for a single variable at a time):
      ./xmlchange --id REST_N --val 4

   Several xml variables that have settings for each component have somewhat special treatment.
   The variables that this currently applies to are:
   For example, to set the number of tasks for all components to 16, use:
      ./xmlchange NTASKS=16
   To set just the number of tasks for the atm component, use:
      ./xmlchange NTASKS_ATM=16

   The CIME case xml variables are grouped together in xml elements <group></group>.
   This is done to associate together xml variables with common features.
   Most variables are only associated with one group. However, in env_batch.xml,
   there are also xml variables that are associated with each potential batch job.
   For these variables, the '--subgroup' option may be used to specify a particular
   group for which the variable's value will be adjusted.

   As an example, in env_batch.xml, the xml variables JOB_QUEUE and JOB_WALLCLOCK_TIME
   appear in each of the batch job groups (defined in config_batch.xml):
    <group id="case.run">
    <group id="case.st_archive">
    <group id="case.test">
   To set the variable JOB_WALLCLOCK_TIME only for case.run:
      ./xmlchange JOB_WALLCLOCK_TIME=0:30 --subgroup case.run
   To set the variable JOB_WALLCLOCK_TIME for all jobs:
      ./xmlchange JOB_WALLCLOCK_TIME=0:30

positional arguments:
  listofsettings        Comma-separated list of settings in the form: var1=value,var2=value,...

optional arguments:
  -h, --help            show this help message and exit
  -d, --debug           Print debug information (very verbose) to file /Users/sacks/cime/scripts/Tools/xmlchange.log
  -v, --verbose         Add additional context (time and file) to log messages
  -s, --silent          Print only warnings and error messages
  --caseroot CASEROOT   Case directory to change.
                        Default is current directory.
  --append, -append     Append to the existing value rather than overwriting it.
  --subgroup SUBGROUP, -subgroup SUBGROUP
                        Apply to this subgroup only.
  --id ID, -id ID       The variable to set.
                        (Used in the alternative --id var --val value form, rather than
                        the recommended var=value form.)
  --val VAL, -val VAL   The value to set.
                        (Used in the alternative --id var --val value form, rather than
                        the recommended var=value form.)
  --file FILE, -file FILE
                        XML file to edit.
                        Generally not needed, but can be specified to ensure that only the
                        expected file is being changed. (If a variable is not found in this file,
                        an error will be generated.)
  --delimiter DELIMITER, -delimiter DELIMITER
                        Delimiter string in listofvalues.
                        Default is ','.
  --dryrun, -dryrun     Parse settings and print key-value pairs, but don't actually change anything.
  --noecho, -noecho     Do not update CaseStatus with this change.
                        This option is mainly meant to be used by cime scripts: the 'paper trail' in
                        CaseStatus is meant to show changes made by the user, so we generally don't
                        want this to be contaminated by changes made automatically by cime scripts.
  -f, --force           Ignore typing checks and store value.
  -loglevel LOGLEVEL    Ignored, only for backwards compatibility.