source: TOOLS/MOSAIX/update_xml.py @ 5915

Last change on this file since 5915 was 4195, checked in by omamce, 6 years ago

O.M. : mostly improvment of documentation

  • Property svn:keywords set to Date Revision HeadURL Author Id
File size: 5.3 KB
RevLine 
[3620]1### ===========================================================================
2###
3### Modifies or add an element in an XML file
4###
5### ===========================================================================
6##
7##  Warning, to install, configure, run, use any of Olivier Marti's
8##  software or to read the associated documentation you'll need at least
9##  one (1) brain in a reasonably working order. Lack of this implement
10##  will void any warranties (either express or implied).
11##  O. Marti assumes no responsability for errors, omissions,
12##  data loss, or any other consequences caused directly or indirectly by
13##  the usage of his software by incorrectly or partially configured
14##  personal.
15##
[3623]16## SVN information
[3665]17__Author__   = "$Author$"
18__Date__     = "$Date$"
19__Revision__ = "$Revision$"
20__Id__       = "$Id$"
[3633]21__HeadURL    = "$HeadURL$"
[3623]22
[3620]23#
24# Tested with python/2.7.12 and python/3.6.4
25#
26import xml.etree.ElementTree
27import getopt, sys
28
29##
30def usage () :
31    texte = """%(prog)s usage :
[3671]32python %(prog)s [-d] [-i iodef.xml] [-o iodef_new.xml] -n <node in Xpath syntax> -k <key>  -v <value>
33python %(prog)s [-d] [-i iodef.xml] [-o iodef_new.xml] -n <node in Xpath syntax> -t <value>
[3620]34 -d         | --debug         : debug
[3671]35 -i <file>  | --input=<file>  : input file  (default: iodef.xml)
[3620]36 -o <file>  | --output=<file> : output file (default: overwrite input file)
[3671]37 -n <node>  | --node=<node>   : node in Xpath syntax
[3620]38 -f <field> | --field=<field> : xml field to update
[3671]39 -v <value> | --value=<value> : new value for xml field
[3620]40 -t <text>  | --text=<text>   : will replace the 'text' part of the Xpath by <text>
[4195]41examples : 
[3671]42    python %(prog)s -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_src"]/field[@id="mask_source"]' -k name -v maskutil_T
[4195]43    python %(prog)s -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="dest_grid"]'   -t ${dstDomainType}
[3620]44    """
45    #print ( texte % ( sys.argv[0], sys.argv[0], sys.argv[0], sys.argv[0] ) )
46    #print ( texte %   ( 6*[sys.argv[0]] ))
47    print ( texte % { 'prog':sys.argv[0] } )
48   
[3671]49# Check version of Python
50Version = sys.version_info
51if Version < (2,7,0) :
[3620]52  sys.stderr.write ( "You need python 2.7 or later to run this script\n" )
[3671]53  sys.stderr.write ( "Present version is: " + str(Version[0]) + "." + str(Version[1]) + "." + str(Version[2]) + "\n" )
[3620]54  sys.exit (1)
55 
[3671]56## Default input parameters
[3620]57FileIn   = 'iodef.xml'
58FileOut  = None
59Node     = None 
60Key      = None
61Text     = None
62Value    = None
63Debug    = False
64
65## Command line options
66try:
67    myopts, myargs = getopt.getopt ( sys.argv[1:], 'i:o:n:k:v:t:dh', [ 'input=', 'output=', 'node=', 'key=', 'value=', 'text=', 'debug=', '--help' ] )
68except getopt.GetoptError as cmdle :
[3671]69    print ( "Command line error : "+cmdle )
[3620]70    usage ()
71    sys.exit(1)
72
73for myopt, myval in myopts :
74    if myopt in [ '-h', '--help'   ] : usage () ; sys.exit (0) ; 
75    if myopt in [ '-i', '--input'  ] : FileIn   = myval
76    if myopt in [ '-o', '--output' ] : FileOut  = myval
77    if myopt in [ '-n', '--node'   ] : Node     = myval
78    if myopt in [ '-k', '--key'    ] : Key      = myval
79    if myopt in [ '-t', '--text'   ] : Text     = myval
80    if myopt in [ '-v', '--value'  ] : Value    = myval
81    if myopt in [ '-d', '--debug'  ] : Debug    = True
82
83## Some coherency checking of command line parameters
[3671]84ErrorCount = 0
[3620]85
[3671]86if FileIn == None :
87    print ( "Error : please specify input file by -i <file>" )
88    ErrorCount += 1
89
[3620]90if Node == None :
[3671]91    print ( "Error : please specify -n <node>" )
92    ErrorCount += 1
[3620]93   
94if Key == None and Text == None :
[3671]95    print ( "Error : please specify either -t <text> or -k <key> -v <value>" )
96    ErrorCount += 1
[3620]97
98if Key != None and Text != None :
[3671]99    print ( "Error : please specify only one option between -t "+Text+" and -k "+Key )
100    ErrorCount += 1
[3620]101
102if Key != None and Value == None :
[3671]103    print ( "Error : please specify -v <value> when -k "+Key+" is given")
104    ErrorCount += 1
105 
106if ErrorCount > 0 :
[3620]107    usage ()
108    sys.exit (1)
[3671]109
110if FileOut == None : FileOut = FileIn
[4153]111
112## Remove white spaces at beginning and end of line
113Node = Node.rstrip().lstrip()
114
[3620]115## Get XML tree from input file
116iodef = xml.etree.ElementTree.parse ( FileIn )
117
118## Find node
119nodeList = iodef.findall ( Node )
120
[3671]121## Check that one and only one node is found
[3620]122if len(nodeList) == 0 :
123    print ( "Error : node not found" )
[3671]124    print ( "Node  : "+Node )
125    sys.exit (1)
[3620]126   
127if len(nodeList) > 1 :
[3671]128    print ( "Error : "+len(nodeList)+" occurences of node found" )
129    print ( "Node  : "+Node )
130    sys.exit (1)
[3620]131
132## Update element
133elem = nodeList[0]
134
135if Debug :
[3671]136    print ( 'Node  : '+Node  )
137    print ( 'Key   : '+Key   )
138    print ( 'Value : '+Value )
[3620]139
140if Text != None :
141    if Debug :
[3671]142        print ( 'Attributes of node: '+str(elem.attrib) )
143        print ( 'Text              : '+str(elem.text)   )
[3620]144    elem.text = Text
145
146if Key != None :
147    # To do : check that Key exist (it is added if not : do we want that ?)
148    if Debug :
[3671]149        print ( 'Attributes of node: '+str(elem.attrib) )
[3620]150    elem.attrib.update ( { Key:Value } )
151   
152
153## Writes XML tree to file
154iodef.write ( FileOut )
155
156## This is the end
[3671]157sys.exit (0)
[3620]158   
159### ===========================================================================
160###
161###                               That's all folk's !!!
162###
163### ===========================================================================
164
Note: See TracBrowser for help on using the repository browser.