Ignore:
Timestamp:
25/09/15 14:11:40 (5 years ago)
Author:
mjuckes
Message:

For 2nd distribution; example volume estimate added

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CMIP6dreq/trunk/src/dreq.py

    r388 r390  
    77import xml.dom 
    88import xml.dom.minidom 
    9 import re 
     9import re, shelve 
     10import sets 
    1011 
    1112class rechecks(object): 
     
    3132       _htmlStyle = {} 
    3233 
    33        def __init__(self,dict=None,xmlMiniDom=None,id='defaultId'): 
     34       def __init__(self,dict=None,xmlMiniDom=None,id='defaultId',etree=False): 
    3435         dictMode = dict != None 
    3536         mdMode = xmlMiniDom != None 
     
    4243           self.dictInit( dict ) 
    4344         elif mdMode: 
    44            self.mdInit( xmlMiniDom ) 
     45           self.mdInit( xmlMiniDom, etree=etree ) 
    4546 
    4647       def __repr__(self): 
     
    137138         self._contentInitialised = True 
    138139 
    139        def mdInit( self, el ): 
     140       def mdInit( self, el, etree=False ): 
    140141         __doc__ = """Initialisation from a mindom XML element. The list of attributes must be set by the class factory before the class is initialised""" 
    141142         deferredHandling=False 
    142143         nw1 = 0 
    143          for a in self._a.keys(): 
    144            if el.hasAttribute( a ): 
    145              v = str( el.getAttribute( a ) ) 
     144         tvtl = [] 
     145         if etree: 
     146           ks = sets.Set( el.keys() ) 
     147           for a in self._a.keys(): 
     148             if a in ks: 
     149               aa = '%s%s' % (self.ns,a) 
     150               tvtl.append( (a,True, str( el.get( a ) ) ) ) 
     151             else: 
     152               tvtl.append( (a,False,None) ) 
     153         else: 
     154           for a in self._a.keys(): 
     155             if el.hasAttribute( a ): 
     156               tvtl.append( (a,True, str( el.getAttribute( a ) ) ) ) 
     157             else: 
     158               tvtl.append( (a,False,None) ) 
     159        
     160         for a,tv,v in tvtl: 
     161           if tv: 
    146162             if self._a[a].type == u'xs:integer': 
    147163               if self._rc.isIntStr( v ): 
     
    169185               thissect = '%s [%s]' % (self._h.title,self._h.tag) 
    170186               print 'ERROR.020.0001: missing uid: %s' % thissect 
     187               if etree: 
     188                 print ks 
     189                 import sys 
     190                 sys.exit(0) 
    171191             self.__dict__[a] = self._d.defaults.get( a, self._d.glob ) 
    172192 
    173            if type( self.__dict__.get( 'rowIndex', 0 ) ) != type(0): 
    174              print 'Bad row index ', el.hasAttribute( 'rowIndex' ) 
    175              raise 
     193           ##if type( self.__dict__.get( 'rowIndex', 0 ) ) != type(0): 
     194             ##print 'Bad row index ', el.hasAttribute( 'rowIndex' ) 
     195             ##raise 
    176196           if deferredHandling: 
    177197             print msg 
     
    183203  """Read in a vocabulary collection configuration document and a vocabulary document""" 
    184204 
    185   def __init__(self, configdoc='out/dreqDefn.xml', thisdoc='../workbook/trial_20150724.xml'): 
     205  def __init__(self, configdoc='out/dreqDefn.xml', thisdoc='../workbook/trial_20150724.xml', useShelve=False): 
    186206    self.rc = rechecks() 
    187207    self.silent = True 
     
    196216    self.coll = {} 
    197217    doc = xml.dom.minidom.parse( self.vdef  ) 
     218## 
     219## elementTree parsing implemented for main document 
     220## 
     221    self.etree = False 
     222    self.etree = True 
     223    if self.etree: 
     224      import xml.etree.cElementTree as cel 
     225 
     226      self.contentDoc = cel.parse( self.vsamp ) 
     227      root = self.contentDoc.getroot() 
     228      bs = string.split( root.tag, '}' ) 
     229      if len( bs ) > 1: 
     230        self.ns = bs[0] + '}' 
     231      else: 
     232        self.ns = None 
     233    else: 
     234      self.contentDoc = xml.dom.minidom.parse( self.vsamp ) 
     235      self.ns = None 
     236 
    198237    vl = doc.getElementsByTagName( 'table' ) 
    199238    self.tables = {} 
     
    204243      t = self.parsevcfg(v) 
    205244      tables[t[0].label] = t 
    206       self.tableClasses[t[0].label] = self.itemClassFact( t ) 
    207  
    208     self.contentDoc = xml.dom.minidom.parse( self.vsamp ) 
     245      self.tableClasses[t[0].label] = self.itemClassFact( t, ns=self.ns ) 
     246 
     247 
    209248    self.recordAttributeDefn = tables 
    210249    for k in tables.keys(): 
    211       vl = self.contentDoc.getElementsByTagName( k ) 
    212       if len(vl) == 1: 
    213         v = vl[0] 
    214         t = v.getAttribute( 'title' ) 
    215         i = v.getAttribute( 'id' ) 
    216         il = v.getElementsByTagName( 'item' ) 
    217         self.info( '%s, %s, %s, %s' % ( k, t, i, len(il) ) ) 
     250      if self.etree: 
     251        vl = root.findall( './/%s%s' % (self.ns,k) ) 
     252        if len(vl) == 1: 
     253          v = vl[0] 
     254          t = v.get( 'title' ) 
     255          i = v.get( 'id' ) 
     256          il = v.findall( '%sitem' % self.ns ) 
     257          self.info( '%s, %s, %s, %s' % ( k, t, i, len(il) ) ) 
    218258  
    219         self.tables[k] = (i,t,len(il)) 
     259          self.tables[k] = (i,t,len(il)) 
    220260         
    221         for i in il: 
    222           ii = self.tableClasses[k](xmlMiniDom=i) 
    223           self.tableItems[k].append( ii ) 
    224       elif len(vl) > 1: 
    225         l1 = [] 
    226         l2 = [] 
    227         for v in vl: 
     261          for i in il: 
     262            ii = self.tableClasses[k](xmlMiniDom=i, etree=True) 
     263            self.tableItems[k].append( ii ) 
     264        elif len(vl) > 1: 
     265          assert False, 'not able to handle repeat sections with etree yet' 
     266      else: 
     267        vl = self.contentDoc.getElementsByTagName( k ) 
     268        if len(vl) == 1: 
     269          v = vl[0] 
    228270          t = v.getAttribute( 'title' ) 
    229271          i = v.getAttribute( 'id' ) 
    230272          il = v.getElementsByTagName( 'item' ) 
    231273          self.info( '%s, %s, %s, %s' % ( k, t, i, len(il) ) ) 
    232           l1.append( (i,t,len(il)) ) 
    233            
    234           l2i = [] 
     274  
     275          self.tables[k] = (i,t,len(il)) 
     276         
    235277          for i in il: 
    236278            ii = self.tableClasses[k](xmlMiniDom=i) 
    237             l2i.append( ii ) 
    238           l2.append( l2i ) 
    239         self.tables[k] = l1 
    240         self.tableItems[k] = l2 
     279            self.tableItems[k].append( ii ) 
     280        elif len(vl) > 1: 
     281          l1 = [] 
     282          l2 = [] 
     283          for v in vl: 
     284            t = v.getAttribute( 'title' ) 
     285            i = v.getAttribute( 'id' ) 
     286            il = v.getElementsByTagName( 'item' ) 
     287            self.info( '%s, %s, %s, %s' % ( k, t, i, len(il) ) ) 
     288            l1.append( (i,t,len(il)) ) 
     289           
     290            l2i = [] 
     291            for i in il: 
     292              ii = self.tableClasses[k](xmlMiniDom=i) 
     293              l2i.append( ii ) 
     294            l2.append( l2i ) 
     295          self.tables[k] = l1 
     296          self.tableItems[k] = l2 
    241297      self.coll[k] = self.ntf( self.recordAttributeDefn[k].header, self.recordAttributeDefn[k].attributes, self.tableItems[k] ) 
    242298  
     
    248304    return self.coll 
    249305 
    250   def itemClassFact(self, sectionInfo): 
     306  def itemClassFact(self, sectionInfo,ns=None): 
    251307     class dreqItem(dreqItemBase): 
    252308       """Inherits all methods from dreqItemBase. 
     
    268324     ##dreqItem.attributes = attributes 
    269325     dreqItem._rc = self.rc 
     326     dreqItem.ns = ns 
    270327     return dreqItem 
    271328          
     
    387444src1 = '../workbook/trial_20150831.xml' 
    388445class loadDreq(object): 
    389   def __init__(self, dreqXML='../docs/dreq.xml',configdoc='../docs/dreq2Defn.xml' ): 
    390     self.c = config( thisdoc=dreqXML, configdoc=configdoc) 
     446  def __init__(self,dreqXML='../docs/dreq.xml',configdoc='../docs/dreq2Defn.xml', useShelve=False ): 
     447    self.c = config( thisdoc=dreqXML, configdoc=configdoc, useShelve=useShelve) 
    391448    self.coll = self.c.get() 
    392449    self.inx = index(self.coll) 
Note: See TracChangeset for help on using the changeset viewer.