コード例 #1
0
ファイル: _blobfields.py プロジェクト: cmeier76/ZMS5
 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
コード例 #2
0
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])