source: CMIP6dreqbuild/trunk/src/framework/docAppend.py @ 1232

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/docAppend.py@1291
Revision 1232, 2.6 KB checked in by mjuckes, 17 months ago (diff)

release candidate

Line 
1import lxml, string,  re, sys
2import lxml.etree as et
3from dreqPy import dreq
4from StringIO import StringIO
5ifile = 'out/annotated_20150731_chk.xml'
6ofile = 'test.xml'
7
8## profile.getparent().remove(profile) from https://stackoverflow.com/questions/39337042/elementtree-remove-element
9
10def lower(x):
11  if x == None:
12    return ''
13  else:
14    return x.lower()
15def getkey(elem):
16    return (lower(elem.get('label')),lower(elem.get('uid')))
17
18
19class dreqAppend(object):
20  def __init__(self,ifile,dq,uidl,rmu=None,forceRm=False):
21    """Append list of items *uidl* to XML document ifile. These items should already be in the *dq* data request object:
22       called y requestReview script which appends items to *dq* object"""
23    self.doc = et.parse( ifile )
24    self.root = self.doc.getroot()
25    self.chapters = self.root.getchildren()
26    self.sections = dict()
27    self.rmu = rmu
28    self.forceRm = forceRm
29    self.items = dict()
30    for c in self.chapters[1:]:
31      for s in c.getchildren():
32        tn = s.tag
33        ix = tn.find( '}' )
34        if ix != -1:
35          tn = tn[ix+1:]
36        self.sections[tn] = s
37        if rmu != None:
38          for i in s.getchildren():
39            self.items[ i.get( 'uid' ) ] = i
40
41    if rmu != None and not forceRm:
42      s = [u for u in rmu if u not in self.items]
43      if len(s) > 0:
44        for x in sorted(s):
45          print 'attempt to remove non-existant items: %s' % x
46      assert len(s) == 0
47    if rmu != None:
48      self.remove()
49
50    for u in uidl:
51      if u not in dq.inx.uid:
52        print 'ERROR.uid.00001: uid not found: %s' % u
53      else:
54
55        this = dq.inx.uid[u]
56        sect = this._h.label
57        docsect = self.sections[sect]
58        d = dict()
59        for k in this._a.keys():
60          if k in this.__dict__:
61            d[k] = str(this.__dict__[k])
62       ##  print d
63        i = self.root.makeelement( '{urn:w3id.org:cmip6.dreq.dreq:a}item', d )
64        i.tail = '\n'
65        docsect.append( i )
66
67  def remove(self):
68    nrm = 0
69    for u in self.rmu:   
70      if u in self.items:
71        this=self.items[u]
72        this.getparent().remove(this)
73        nrm += 1
74    print 'Items removed: %s' % nrm
75
76  def write(self,ofile='test.xml'):
77    for s in self.sections:
78      try:
79        section = self.doc.findall('.//{urn:w3id.org:cmip6.dreq.dreq:a}%s' % s)
80        lines = section[0]
81        lines[:] = sorted(lines, key=getkey)
82   
83      except:
84        print 'Failed to find: %s' % s
85        raise
86
87    output = StringIO()
88    self.doc.write_c14n(output)
89    sdoc = output.getvalue()
90    oo = open( ofile, 'w' )
91    oo.write( sdoc )
92    oo.close()
93
94
95
Note: See TracBrowser for help on using the repository browser.