def toXml(self, sender=None, base_path='', data2hex=True): """ Serialize this file to xml-string. @param sender: the sender-node @type sender: C{zmsobject.ZMSObject=None} @param base_path: the base-path @type base_path: C{str=''} @param data2hex: convert data inline to hex, otherwise saved to file in base-path @type data2hex: C{Bool=True} @return: the xml-string @rtype: C{str} """ data = '' objtype = '' filename = _fileutil.getOSPath( _fileutil.extractFilename(getattr(self, 'filename', ''))) content_type = getattr(self, 'content_type', '') if data2hex: if content_type.startswith('text/') or content_type in [ 'application/css', 'application/javascript', 'image/svg' ]: data = '<![CDATA[%s]]>' % str(self.getData(sender), 'utf-8') else: data = standard.bin2hex(bytes(self.getData(sender))) objtype = ' type="file"' else: filename = self.getFilename() filename = getLangFilename(sender, filename, self.lang) filename = '%s%s' % (base_path, filename) xml = '\n<data' xml += ' content_type="%s"' % content_type xml += ' filename="%s"' % filename xml += objtype + '>' + data xml += '</data>' return xml
def toXml(self, value, indentlevel=0, xhtml=False, encoding='utf-8'): xml = [] if value is not None: # Image if isinstance(value, _blobfields.MyImage): xml.append('\n' + indentlevel * INDENTSTR + value.toXml(self)) # File elif isinstance(value, _blobfields.MyFile): xml.append('\n' + indentlevel * INDENTSTR + value.toXml(self)) # File (Zope-native) elif isinstance(value, File): tagname = 'data' content_type = value.content_type xml.append('\n' + indentlevel * INDENTSTR) xml.append('<%s' % tagname) xml.append(' content_type="%s"' % content_type) xml.append(' filename="%s"' % value.title) xml.append(' type="file"') xml.append('>') data = zopeutil.readData(value) if content_type.startswith('text/') or content_type in ['application/css','application/javascript','image/svg']: try: data = standard.pystr(data,'utf-8') except: pass cdata = None # Ensure CDATA is valid. try: cdata = '<![CDATA[%s]]>'%data p = pyexpat.ParserCreate() rv = p.Parse('<?xml version="1.0" encoding="utf-8"?><%s>%s</%s>'%(tagname,cdata,tagname), 1) # Otherwise use binary encoding. except: cdata = standard.bin2hex(standard.pybytes(data)) xml.append(cdata) xml.append('</%s>' % tagname) # Dictionaries elif isinstance(value, dict): keys = sorted(value) xml.append('\n' + indentlevel * INDENTSTR) xml.append('<dictionary>') indentstr = '\n' + (indentlevel + 1) * INDENTSTR for x in keys: k = ' key="%s"' % x xv = value[x] tv = getXmlType(xv) sv = toXml(self, xv, indentlevel + 2, xhtml, encoding) xml.append(indentstr) xml.append('<item%s%s>' % (k, tv)) xml.append(sv) if sv.find('\n') >= 0: xml.append(indentstr) xml.append('</item>') xml.append('\n' + indentlevel * INDENTSTR) xml.append('</dictionary>') # Lists elif isinstance(value, list): xml.append('\n' + indentlevel * INDENTSTR) xml.append('<list>') indentstr = '\n' + (indentlevel + 1) * INDENTSTR for xv in value: k = '' tv = getXmlType(xv) sv = toXml(self, xv, indentlevel + 2, xhtml, encoding) xml.append(indentstr) xml.append('<item%s%s>' % (k, tv)) xml.append(sv) if sv.startswith('\n'): xml.append(indentstr) xml.append('</item>') xml.append('\n' + indentlevel * INDENTSTR) xml.append('</list>') # Tuples (DateTime) elif isinstance(value, tuple) or isinstance(value, time.struct_time) or isinstance(value, DateTime): try: s_value = self.getLangFmtDate(value, 'eng', 'DATETIME_FMT') if len(s_value) > 0: xml.append('\n' + indentlevel * INDENTSTR) xml.append(toCdata(self, s_value, -1)) except: pass # Numbers elif isinstance(value, int) or isinstance(value, float): xml.append(value) else: # Zope-Objects try: meta_type = value.meta_type except: meta_type = None if meta_type is not None: value = zopeutil.readData(value) if value: xml.append(toCdata(self, value, xhtml)) # Return xml. return ''.join([standard.pystr(x) for x in xml])