def cb(self, sw, pyobj, name=None, **kw): if not self.mutable and sw.Known(pyobj): return objid = _get_object_id(pyobj) n = name or self.oname or ('E' + objid) if self.inline: print >>sw, '<%s>' % n else: if kw.get('typed', self.typed): attrtext = ' xmlns="%s" xsi:type="%s" ' % (self.type[0], self.type[1]) else: attrtext = '' print >>sw, '<%s %sid="%s">' % (n, attrtext, objid) if self.pyclass: d = pyobj.__dict__ else: d = pyobj if TypeCode.typechecks and type(d) != types.DictType: raise TypeError("Classless struct didn't get dictionary") for what in self.ofwhat: v = d.get(what.aname) if v is None: v = d.get(what.aname.lower()) if what.optional and v is None: continue try: if what.repeatable and type(v) in _seqtypes: for v2 in v: what.serialize(sw, v2) else: what.serialize(sw, v) except Exception, e: raise Exception('Serializing %s.%s, %s %s' % (n, what.aname or '?', e.__class__.__name__, str(e)))
def serialize(self, sw, pyobj, inline=None, name=None, attrtext='', **kw): if inline or self.inline: self.cb(sw, pyobj, name=name, **kw) else: objid = _get_object_id(pyobj) n = name or self.oname or ('E' + objid) print >>sw, '<%s%s href="#%s"/>' % (n, attrtext, objid) sw.AddCallback(self.cb, pyobj)
def serialize(self, sw, pyobj, name=None, attrtext='', childnames=None, **kw): if not self.mutable and sw.Known(pyobj): return objid = _get_object_id(pyobj) n = name or self.oname or ('E' + objid) offsettext = '' if not self.sparse and not self.nooffset: offset, end = 0, len(pyobj) while offset < end and pyobj[offset] == self.fill: offset += 1 if offset: offsettext = ' SOAP-ENC:offset="[%d]"' % offset if self.unique: idtext = '' else: idtext = ' id="%s"' % objid if self.undeclared: print >>sw, '<%s%s%s%s>' % \ (n, attrtext, offsettext, idtext) else: print >>sw, '<%s%s%s%s SOAP-ENC:arrayType="%s">' % \ (n, attrtext, offsettext, idtext, self.atype) d = {} kn = childnames or self.childnames if kn: d['name'] = kn elif not self.ofwhat.aname: d['name'] = 'element' if not self.sparse: for e in pyobj[offset:]: self.ofwhat.serialize(sw, e, **d) else: position = 0 for pos, v in pyobj: if pos != position: d['attrtext'] = ' SOAP-ENC:position="[%d]"' % pos position = pos else: d['attrtext'] = '' self.ofwhat.serialize(sw, v, **d) position += 1 i = n.find('xmlns') if i > 0: print >>sw, '</%s>' % n[:i - 1] else: print >>sw, '</%s>' % n