+ if nameSpaceKey == "":
+ defaultLongNS = nameSpaceUrl
+ nameSpaces[DEFAULT_NAMESPACE_KEY] = nameSpaceUrl
+ newNS.nsMap[DEFAULT_NAMESPACE_KEY] = nameSpaceUrl
+ nameSpaceAttrs += ' xmlns="%s" ' % (nameSpaceUrl)
+ else:
+ nameSpaces[nameSpaceKey] = nameSpaceUrl
+ newNS.nsMap[nameSpaceKey] = nameSpaceUrl
+ nameSpaceAttrs += ' xmlns:%s="%s" ' % (nameSpaceKey, nameSpaceUrl)
+ nameSpaceAttrs = nameSpaceAttrs.rstrip()
+ if len(self.nsstack) > 0:
+ newNS.prefix = self.nsstack[-1].prefix
+ else:
+ newNS.prefix = ''
+ if hasattr(obj, "__xmldefaultnamespace__"):
+ longPrefixNS = getattr(obj, "__xmldefaultnamespace__")
+ if longPrefixNS == defaultLongNS:
+ newNS.prefix = ''
+ else:
+ try:
+ for k, v in nameSpaces.iteritems():
+ if v == longPrefixNS:
+ newNS.prefix = k + ':'
+ break;
+## print '[appendNSStack] found longPrefixNS in nameSpaces = "%s"' % (newNS.prefix)
+ except:
+ if (longPrefixNS in asDict(self.knownNamespaces)):
+ newNS.prefix = self.knownNamespaces[longPrefixNS] + ':'
+ else:
+ raise MarshallerException('Error marshalling __xmldefaultnamespace__ ("%s") not defined in namespace stack' % (longPrefixNS))
+ if hasattr(obj, "targetNamespace"):
+ newNS.targetNS = obj.targetNamespace
+ elif len(self.nsstack) > 0:
+ newNS.targetNS = self.nsstack[-1].targetNS
+ newNS.nameSpaces = nameSpaces
+ self.nsstack.append(newNS)
+ return nameSpaceAttrs
+
+ def contractQName(self, value, obj, attr):
+ value = langToXsdType(value)
+ i = value.rfind(':')
+ if i >= 0:
+ longNS = value[:i]
+ else:
+ # the value doesn't have a namespace and we couldn't map it to an XSD type...what to do?
+ # (a) just write it, as is, and hope it's in the default namespace (for now)
+ # (b) throw an exception so we can track down the bad code (later)
+ return value
+ if (longNS in self.nsstack[-1].nameSpaces.values()):
+ for kShort, vLong in self.nsstack[-1].nameSpaces.iteritems():
+ if vLong == longNS:
+ shortNS = kShort
+ break
+ else:
+ shortNS = longNS # if we can't find the long->short mappping, just use longNS
+ if shortNS == DEFAULT_NAMESPACE_KEY:
+ value = value[i+1:]
+ else:
+ value = shortNS + ':' + value[i+1:]
+ return value
+
+ def _genObjTypeStr(self, typeString):
+ if self.marshalType:
+ return ' objtype="%s"' % typeString
+ return ""
+
+ def _marshal(self, obj, elementName=None, nameSpacePrefix="", indent=0):
+ if (obj != None):
+ xmlMarshallerLogger.debug("--> _marshal: elementName=%s%s, type=%s, obj=%s, indent=%d" % (nameSpacePrefix, elementName, type(obj), str(obj), indent))
+ else:
+ xmlMarshallerLogger.debug("--> _marshal: elementName=%s%s, obj is None, indent=%d" % (nameSpacePrefix, elementName, indent))
+ excludeAttrs = []
+ excludeAttrs.extend(self.xmldeepexclude)
+ if hasattr(obj, "__xmlexclude__"):
+ excludeAttrs.extend(obj.__xmlexclude__)
+ prettyPrint = self.prettyPrint
+ knownTypes = self.knownTypes
+ xmlString = None
+ if self.prettyPrint or indent:
+ prefix = " "*indent
+ newline = "\n"
+ increment = 2
+ else:
+ prefix = ""
+ newline = ""
+ increment = 0
+ ## Determine the XML element name. If it isn"t specified in the
+ ## parameter list, look for it in the __xmlname__ Lang
+ ## attribute, else use the default generic BASETYPE_ELEMENT_NAME.
+ nameSpaceAttrs = self.appendNSStack(obj)
+ nameSpacePrefix = self.getNSPrefix()
+ if not elementName:
+ if hasattr(obj, "__xmlname__"):
+ elementName = nameSpacePrefix + obj.__xmlname__
+ else:
+ elementName = nameSpacePrefix + BASETYPE_ELEMENT_NAME
+ else:
+ elementName = nameSpacePrefix + elementName
+## print '[XMLMarshalWorker._marshal] elementName "%s"; nameSpaceAttrs is "%s"' % (elementName, nameSpaceAttrs)
+
+ if (hasattr(obj, "__xmlsequencer__")) and (obj.__xmlsequencer__ != None):
+ if (XMLSCHEMA_XSD_URL in self.nsstack[-1].nameSpaces.values()):
+ for kShort, vLong in self.nsstack[-1].nameSpaces.iteritems():
+ if vLong == XMLSCHEMA_XSD_URL:
+ xsdPrefix = kShort + ':'
+ break
+ else:
+ xsdPrefix = 'xs:'
+ elementAdd = xsdPrefix + obj.__xmlsequencer__
+ else:
+ elementAdd = None
+
+ ## print "marshal: entered with elementName: ", elementName
+ members_to_skip = []
+ ## Add more members_to_skip based on ones the user has selected
+ ## via the __xmlexclude__ and __xmldeepexclude__ attributes.
+ members_to_skip.extend(excludeAttrs)
+ # Marshal the attributes that are selected to be XML attributes.
+ objattrs = ""
+ className = ag_className(obj)
+ classNamePrefix = "_" + className
+ if hasattr(obj, "__xmlattributes__"):
+ xmlattributes = obj.__xmlattributes__
+ members_to_skip.extend(xmlattributes)
+ for attr in xmlattributes:
+## print 'Processing element "%s"; attribute "%s"' % (elementName, attr)
+ internalAttrName = attr
+ ifDefPy()
+ if (attr.startswith("__") and not attr.endswith("__")):
+ internalAttrName = classNamePrefix + attr
+ endIfDef()
+ # Fail silently if a python attribute is specified to be
+ # an XML attribute but is missing.
+## print "marshal: processing attribute ", internalAttrName
+ attrNameSpacePrefix = ""
+ if hasattr(obj, "__xmlattrnamespaces__"):
+ for nameSpaceKey, nameSpaceAttributes in getattr(obj, "__xmlattrnamespaces__").iteritems():
+ if nameSpaceKey == nameSpacePrefix[:-1]: # Don't need to specify attribute namespace if it is the same as its element
+ continue
+ if attr in nameSpaceAttributes:
+ attrNameSpacePrefix = nameSpaceKey + ":"
+ break
+ attrs = obj.__dict__
+ value = attrs.get(internalAttrName)
+ if (hasattr(obj, "__xmlrename__") and attr in asDict(obj.__xmlrename__)):
+ attr = obj.__xmlrename__[attr]
+ xsdElement = None
+ complexType = getComplexType(obj)
+ if (complexType != None):
+ xsdElement = complexType.findElement(attr)
+ if (xsdElement != None):
+ default = xsdElement.default
+ if (default != None):
+ if ((default == value) or (default == _getXmlValue(value))):
+ continue