+ # Only add the objtype if the element tag is unknown to us.
+ if (isinstance(obj, GenericXMLObject)):
+ objTypeStr = ""
+ elif (self.isKnownType(elementName) == True):
+ objTypeStr = ""
+ else:
+ objTypeStr = self._genObjTypeStr("%s.%s" % (obj.__class__.__module__, className))
+ xmlString = ['%s<%s%s%s%s' % (prefix, elementName, nameSpaceAttrs, objattrs, objTypeStr)]
+ # get the member, value pairs for the object, filtering out the types we don"t support
+ if (elementAdd != None):
+ prefix += increment*" "
+ indent += increment
+ xmlMemberString = []
+ if hasattr(obj, "__xmlbody__"):
+ xmlbody = getattr(obj, obj.__xmlbody__)
+ if xmlbody != None:
+ xmlMemberString.append(utillang.escape(xmlbody))
+ else:
+ if hasattr(obj, "__xmlattrgroups__"):
+ attrGroups = obj.__xmlattrgroups__.copy()
+ if (not isinstance(attrGroups, dict)):
+ raise "__xmlattrgroups__ is not a dict, but must be"
+ for n in attrGroups.iterkeys():
+ members_to_skip.extend(attrGroups[n])
+ else:
+ attrGroups = {}
+ # add the list of all attributes to attrGroups
+ eList = obj.__dict__.keys()
+ eList.sort()
+ attrGroups["__nogroup__"] = eList
+
+ for eName, eList in attrGroups.iteritems():
+ if (eName != "__nogroup__"):
+ prefix += increment*" "
+ indent += increment
+ objTypeStr = self._genObjTypeStr("None")
+ xmlMemberString.append('%s<%s%s>%s' % (prefix, eName, objTypeStr, newline))
+ for name in eList:
+ value = obj.__dict__[name]
+ if eName == "__nogroup__" and name in members_to_skip: continue
+ if name.startswith("__") and name.endswith("__"): continue
+ if (hasattr(obj, "__xmlcdatacontent__") and (obj.__xmlcdatacontent__ == name)):
+ continue
+ subElementNameSpacePrefix = nameSpacePrefix
+ if hasattr(obj, "__xmlattrnamespaces__"):
+ for nameSpaceKey, nameSpaceValues in getattr(obj, "__xmlattrnamespaces__").iteritems():
+ if name in nameSpaceValues:
+ subElementNameSpacePrefix = nameSpaceKey + ":"
+ break
+ # handle sequences listed in __xmlflattensequence__
+ # specially: instead of listing the contained items inside
+ # of a separate list, as God intended, list them inside
+ # the object containing the sequence.
+ if (hasattr(obj, "__xmlflattensequence__") and (value != None) and (name in asDict(obj.__xmlflattensequence__))):
+ xmlnametuple = obj.__xmlflattensequence__[name]
+ if (xmlnametuple == None):
+ xmlnametuple = [name]
+ elif (not isinstance(xmlnametuple, (tuple,list))):
+ xmlnametuple = [str(xmlnametuple)]
+ xmlname = None
+ if (len(xmlnametuple) == 1):
+ xmlname = xmlnametuple[0]
+ if not isinstance(value, (list, tuple)):
+ value = [value]
+ for seqitem in value:
+ xmlMemberString.extend(self._marshal(seqitem, xmlname, subElementNameSpacePrefix, indent=indent+increment))
+ else:
+ if (hasattr(obj, "__xmlrename__") and name in asDict(obj.__xmlrename__)):
+ xmlname = obj.__xmlrename__[name]
+ else:
+ xmlname = name
+ if (value != None):
+ xmlMemberString.extend(self._marshal(value, xmlname, subElementNameSpacePrefix, indent=indent+increment))
+ if (eName != "__nogroup__"):
+ xmlMemberString.append("%s</%s>%s" % (prefix, eName, newline))
+ prefix = prefix[:-increment]
+ indent -= increment
+
+ # if we have nested elements, add them here, otherwise close the element tag immediately.
+ newList = []
+ for s in xmlMemberString:
+ if (len(s) > 0): newList.append(s)
+ xmlMemberString = newList
+ if len(xmlMemberString) > 0:
+ xmlString.append(">")
+ if hasattr(obj, "__xmlbody__"):
+ xmlString.extend(xmlMemberString)
+ xmlString.append("</%s>%s" % (elementName, newline))
+ else:
+ xmlString.append(newline)
+ if (elementAdd != None):
+ xmlString.append("%s<%s>%s" % (prefix, elementAdd, newline))
+ xmlString.extend(xmlMemberString)
+ if (elementAdd != None):
+ xmlString.append("%s</%s>%s" % (prefix, elementAdd, newline))
+ prefix = prefix[:-increment]
+ indent -= increment
+ xmlString.append("%s</%s>%s" % (prefix, elementName, newline))
+ else:
+ if hasattr(obj, "__xmlcdatacontent__"):
+ cdataAttr = obj.__xmlcdatacontent__
+ cdataContent = obj.__dict__[cdataAttr]
+ xmlString.append("><![CDATA[%s]]></%s>%s" % (cdataContent, elementName, newline))
+ else:
+ xmlString.append("/>%s" % newline)
+ if aglogging.isEnabledForDebug(xmlMarshallerLogger):
+ aglogging.debug(xmlMarshallerLogger, "<-- _marshal: %s", objutils.toDiffableString(xmlString))
+ #print "<-- _marshal: %s" % str(xmlString)
+ self.popNSStack()
+ return xmlString