def OnEndElement(self, sTagName): """ XmlAttrBuilder.OnEndElement """ # -- TAG-STACK tag = self.dTagStack.pop() name = standard.unencode(tag['name']) attrs = standard.unencode(tag['attrs']) cdata = standard.unencode(tag['cdata']) # Hack for nested CDATA cdata = re.compile(r'\<\!\{CDATA\{(.*?)\}\}\>').sub( r'<![CDATA[\1]]>', cdata) if name != sTagName: raise ParseError("Unmatching end tag (" + str(sTagName) + ") expected (" + str(name) + ")") # -- DATA if sTagName in ['data']: filename = attrs.get('filename') content_type = attrs.get('content_type') try: data = standard.hex2bin(cdata) except: data = bytes(cdata, 'utf-8') file = { 'data': data, 'filename': filename, 'content_type': content_type } objtype = attrs.get('type') item = _blobfields.createBlobField(None, objtype, file) for key in attrs: value = attrs.get(key) setattr(item, key, value) self.dValueStack.pop() self.dValueStack.append(item) # -- ITEM elif sTagName in ['item']: if tag['dValueStack'] < len(self.dValueStack): item = self.dValueStack.pop() else: item = cdata item = getXmlTypeSaveValue(item, attrs) value = self.dValueStack.pop() if isinstance(value, dict): key = attrs.get('key') value[key] = item if isinstance(value, list): value.append(item) self.dValueStack.append(value)
def xmlOnUnknownEndTag(self, sTagName): # -- TAG-STACK tag = self.dTagStack.pop() skip = len([x for x in self.oCurrNode.dTagStack if x.get('skip')]) > 0 name = standard.unencode(tag['name']) if name != sTagName: return 0 # don't accept any unknown tag attrs = standard.unencode(tag['attrs']) cdata = standard.unencode(tag['cdata']) # -- ITEM (DICTIONARY|LIST) -- #---------------------------- if sTagName in ['dict', 'dictionary']: pass elif sTagName == 'list': pass elif sTagName == 'item': item = cdata if tag['dValueStack'] < len(self.dValueStack): item = self.dValueStack.pop() else: item = cdata item = getXmlTypeSaveValue(item, attrs) value = self.dValueStack.pop() if isinstance(value, dict): key = attrs.get('key') value[key] = item if isinstance(value, list): value.append(item) self.dValueStack.append(value) # -- DATA (IMAGE|FILE) -- #----------------------- elif sTagName == 'data': value = attrs if cdata is not None and len(cdata) > 0: filename = attrs.get('filename') content_type = attrs.get('content_type') try: data = standard.hex2bin(cdata) except: data = bytes(cdata, 'utf-8') value['data'] = data self.dValueStack.append(value) # -- LANGUAGE -- #-------------- elif sTagName == 'lang': lang = attrs.get('id', self.getPrimaryLanguage()) if len(self.dValueStack) == 1: item = cdata else: item = self.dValueStack.pop() values = self.dValueStack.pop() values[lang] = item self.dValueStack.append(values) # -- OBJECT-ATTRIBUTES -- #----------------------- elif sTagName in self.getObjAttrs(): if not skip: obj_attr = self.getObjAttr(sTagName) # -- DATATYPE datatype = obj_attr['datatype_key'] # -- Multi-Language Attributes. if obj_attr['multilang']: item = self.dValueStack.pop() if item is not None: if not isinstance(item, dict): item = {self.getPrimaryLanguage(): item} for s_lang in item: value = item[s_lang] # Data if datatype in _globals.DT_BLOBS: if isinstance(value, dict) and len(value.keys()) > 0: ob = _blobfields.createBlobField( self, datatype) for key in value: setattr(ob, key, value[key]) xmlInitObjProperty(self, sTagName, ob, s_lang) # Others else: # -- Init Properties. xmlInitObjProperty(self, sTagName, value, s_lang) else: # -- Complex Attributes (Blob|Dictionary|List). value = None if len(self.dValueStack) > 0: value = self.dValueStack.pop() if value is not None and \ (datatype in _globals.DT_BLOBS or \ datatype == _globals.DT_LIST or \ datatype == _globals.DT_DICT): # Data if datatype in _globals.DT_BLOBS: if isinstance(value, dict) and len(value.keys()) > 0: ob = _blobfields.createBlobField(self, datatype) for key in value: setattr(ob, key, value[key]) xmlInitObjProperty(self, sTagName, ob) # Others else: if self.getType() == 'ZMSRecordSet': if isinstance(value, list): for item in value: if isinstance(item, dict): for key in item: item_obj_attr = self.getObjAttr( key) item_datatype = item_obj_attr[ 'datatype_key'] if item_datatype in _globals.DT_BLOBS: item_data = item[key] if isinstance(item_data, dict): blob = _blobfields.createBlobField( self, item_datatype, item_data) blob.on_setobjattr() item[key] = blob # -- Convert multilingual to monolingual attributes. if obj_attr['multilang'] == 0 and \ isinstance(value, dict) and \ len(value.keys()) == 1 and \ value.keys()[0] == self.getPrimaryLanguage(): value = value[value.keys()[0]] xmlInitObjProperty(self, sTagName, value) if len(self.dValueStack) > 0: raise "Items on self.dValueStack=%s" % self.dValueStack # -- Simple Attributes (String, Integer, etc.) else: if value is not None: standard.writeBlock( self, "[xmlOnUnknownEndTag]: WARNING - Skip %s" % sTagName) value = cdata # -- OPTIONS if 'options' in obj_attr: options = obj_attr['options'] if isinstance(options, list): try: i = options.index(int(value)) if i % 2 == 1: value = options[i - 1] except: try: i = options.index(value) if i % 2 == 1: value = options[i - 1] except: pass xmlInitObjProperty(self, sTagName, value) # Clear value stack. self.dValueStack.clear() # -- OTHERS -- #------------ else: value = None if len(self.dTagStack): value = self.dTagStack.pop() if value is None: value = {'cdata': ''} cdata = value.get('cdata', '') cdata += '<' + tag['name'] for attr_name in attrs: attr_value = attrs.get(attr_name) cdata += ' ' + attr_name + '="' + attr_value + '"' cdata += '>' + tag['cdata'] cdata += '</' + tag['name'] + '>' value['cdata'] = cdata self.dTagStack.append(value) return 1 # accept matching end tag