Changeset 3910


Ignore:
Timestamp:
19/05/08 17:15:57 (11 years ago)
Author:
cbyrom
Message:

Fix problems with molesReadWrite - including escaping of special
characters + avoiding outputting abstractText element twice.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI01-discovery/branches/ingestAutomation-upgrade/OAIBatch/molesReadWrite.py

    r3800 r3910  
    1 #Dominic Lowe, BADC  18 October 2006 
    2 #Updated Sue Latham, BADC 6 December 2006 - add dgStructuredKeyword class 
    3  
    4 import cElementTree as ET 
    5 import sys 
     1try: #python 2.5 
     2    from xml.etree import cElementTree as ET 
     3except ImportError: 
     4    try: 
     5        # if you've installed it yourself it comes this way 
     6        import cElementTree as ET 
     7    except ImportError: 
     8        # if you've egged it this is the way it comes 
     9        from ndgUtils.elementtree import cElementTree as ET 
     10import sys, re 
    611 
    712 
     
    2429        #if this element is a parent of other elements (excluding annotation and documentation) 
    2530        #then return True else return false 
    26         if elem[:]==[]: 
     31        if elem.getchildren()==[]: 
    2732            return False 
    28         for child in elem[:]: 
     33        for child in elem.getchildren(): 
    2934            if child.tag == '{http://www.w3.org/2001/XMLSchema}element': 
    3035                return True 
     
    5964 
    6065        return False 
    61          
    62          
    63          
     66 
    6467         
    6568    def __checkChildren(self, parentclassname, elem):      
    6669        #if parentclassname == 'dgMetadataProvenance': 
    6770            #pdb.set_trace() 
    68         for child in elem[:]: 
     71        for child in elem.getchildren(): 
    6972            childname = None 
    7073            if child.attrib.has_key('name'):         
     
    8992                    tmp= self.sequences[parentclassname]                     
    9093                    tmp.append(childname) 
    91                     self.sequences[parentclassname]=tmp              
     94                    self.sequences[parentclassname]=tmp 
    9295                if self.__isParent(child): 
    9396                    if not self.sequences.has_key(childname): 
     
    105108                pass 
    106109             
    107     def setup(self):     
     110    def setup(self): 
    108111        tree = ET.parse(self.schema) 
    109112        root = tree.getroot() 
     
    170173            setattr(self,childname, childobj) 
    171174     
    172     def toXML(self,molesFrag, schema=None): 
     175    def toXML(self, molesFrag, schema=None): 
    173176        if schema != None: 
    174177            self.schema=schema 
    175178        else: 
    176179            self.schema=None 
    177         #print molesFrag.tag 
    178180        orderedAttribs=schema.lookupOrder(self.__dict__,molesFrag.tag) 
    179181        for item in orderedAttribs: 
    180            #print "item in orderedAttribs is %s" %item 
    181182           if type(item) is xmlSchema: 
    182183                        continue 
    183184           if item == '{http://ndg.nerc.ac.uk/moles}': 
    184185                continue 
     186                     
     187           # avoid abstractText being output twice 
     188           # NB, this is a hack to fix the problem of this class not handling 
     189           # namespaces correctly - ideally this is what should be fixed here 
     190           if str(molesFrag.tag) == "abstract": 
     191                if len(molesFrag) > 0: 
     192                    continue 
     193             
     194           frag = None 
    185195           if hasattr(self, item): 
    186196                if isinstance(self.__dict__[item], molesElement): 
     
    193203                            frag=ET.Element(item) 
    194204                            it.toXML(frag, schema=self.schema) 
    195                             molesFrag.append(frag) 
    196205                        else: 
    197206                            frag=ET.Element(item) 
    198207                            frag.text=it                             
    199                             molesFrag.append(frag) 
     208                         
     209                        molesFrag.append(frag) 
    200210                else: 
    201211                    frag=ET.Element(item) 
    202212                    frag.text=self.__dict__[item] 
    203213                    molesFrag.append(frag) 
     214             
    204215        return molesFrag 
    205216             
     
    224235                else: 
    225236                    childWithoutNS, ns=self._stripNS(child.tag) 
    226                     setattr(self,childWithoutNS, child.text) 
     237                     
     238                    # escape any special characters - mainly required for 
     239                    # >, etc which get expanded out whilst processing the 
     240                    # elements here 
     241                    value = self.escapeSpecialCharacters(child.text) 
     242                    setattr(self,childWithoutNS, value) 
     243                     
     244    def escapeSpecialCharacters(self, text): 
     245        ''' 
     246        Escape any special characters included in the input text string 
     247        @param text: string to escape special characters from 
     248        @return: string with special characters escaped  
     249        ''' 
     250        subtool=subAI() 
     251        s=subtool.sub(text) 
     252        #if text != s: 
     253        #    print "NB, adjusted string content: %s -> %s" %(text, s) 
     254        return s 
     255         
     256 
     257class subAI: 
     258    ''' This is Alan Iwi's substitute and replace orphan <> code ''' 
     259    def __init__(self): 
     260        self.r1=re.compile('<([^>]*(<|$))') 
     261        self.r2=re.compile('((^|>)[^<]*)>') 
     262    def sub(self,s): 
     263        if s is None: 
     264            return s 
     265         
     266        old='' 
     267        while s != old: 
     268            old=s 
     269            s=self.r1.sub(r'&lt;\1',s) 
     270            s=self.r2.sub(r'\1&gt;',s) 
     271        return s 
    227272         
    228273                     
     
    253298        ['dataModelID', \ 
    254299        'dgDataGranule', \ 
     300        'dgGranuleSummary',\ 
     301        'dgGranuleName',\ 
     302        'simpleCondition',\ 
     303        'dgSecurityCondition',\ 
     304        'accessControlPolicy',\ 
    255305        'dgDataEntity', \ 
    256306        'dgMetadataRecord', \ 
     
    263313        'dgTemporalCoverage', \ 
    264314        'dgBoundingBox', \ 
     315        'dgArea',\ 
    265316        'DateRange', \ 
    266317        'dgDataSummary', \ 
     
    279330        'dgValidTermParentID', \ 
    280331        'dgValidSubterm', \ 
     332        'ListLevel',\ 
    281333        'metadataDescriptionID', \ 
    282334        'dgMetadataDescription', \ 
     
    284336        'abstract',\ 
    285337        'descriptionSection',\ 
     338        'dgReferenceClass',\ 
    286339        'descriptionOnlineReference',\ 
    287340        'dgSimpleLink',\ 
     
    318371        'DataProductionToolID',\ 
    319372        'ObservationStationID',\ 
     373        'ObsStationDeployment',\ 
    320374        'dgPrincipalInvestigator',\ 
    321375        'dgInvestigator',\ 
     
    323377        'dgCruise',\ 
    324378        'RelatedDeployment',\ 
     379        'dgModel',\ 
     380        'DPTDeployment',\ 
     381        'dgInstrument',\ 
     382        'dgDataProductionTool',\ 
     383        'dgDPTRole',\ 
     384        'dgObservationStation',\ 
     385        'dgStationaryPlatform',\ 
     386        'dgMovingPlatform',\ 
     387        'dgLandStation',\ 
     388        'dgMooring',\ 
     389        'position',\ 
     390        'dgStationGroup',\ 
     391        'dgShip',\ 
     392        'vesselType',\ 
     393        'RecordCreation',\ 
     394        'RecordUpdate',\ 
     395        'dgMetadataProvenance',\ 
    325396        ] 
    326397 
     
    338409        print key 
    339410        print schema.sequences[key] 
    340      
    341  
    342411  
    343     
     412 
    344413if __name__=='__main__': 
    345414    main() 
Note: See TracChangeset for help on using the changeset viewer.