diff -r bac1b86276d9 -r 40117d02601b xmlclass/xmlclass.py --- a/xmlclass/xmlclass.py Wed Aug 28 11:53:50 2013 +0200 +++ b/xmlclass/xmlclass.py Thu Aug 29 00:28:39 2013 +0200 @@ -549,18 +549,19 @@ p.text = etree.CDATA(value) def InitialAny(): - text = etree.CDATA(value) if infos["namespace"][0] == "##any": element_name = "p" else: element_name = "{%s}p" % infos["namespace"][0] - return etree.Element(element_name, text) + p = etree.Element(element_name) + p.text = etree.CDATA("") + return p return { "type": COMPLEXTYPE, "extract": ExtractAny, "generate": GenerateAny, - "initial": lambda: GenerateAny(""), + "initial": InitialAny, "check": lambda x: isinstance(x, (StringType, UnicodeType, etree.ElementBase)) } @@ -600,7 +601,7 @@ infos["elmt_type"] = FindTypeInfos(factory, infos["elmt_type"]) if infos["minOccurs"] == 1: element_name = factory.etreeNamespaceFormat % infos["name"] - if infos["type"] == SIMPLETYPE: + if infos["elmt_type"]["type"] == SIMPLETYPE: def initial_value(): value = etree.Element(element_name) value.text = (infos["elmt_type"]["generate"](infos["elmt_type"]["initial"]())) @@ -608,7 +609,9 @@ else: def initial_value(): value = infos["elmt_type"]["initial"]() - DefaultElementClass.__setattr__(value, "tag", element_name) + if infos["type"] != ANY: + DefaultElementClass.__setattr__(value, "tag", element_name) + value.init() return value return [initial_value() for i in xrange(infos["minOccurs"])] else: @@ -1115,9 +1118,12 @@ def ExtractTypeInfos(self, name, parent, typeinfos): if isinstance(typeinfos, (StringType, UnicodeType)): namespace, type_name = DecomposeQualifiedName(typeinfos) - if namespace == self.TargetNamespace and name != "base": - self.AddToLookupClass(name, parent, type_name) infos = self.GetQualifiedNameInfos(type_name, namespace) + if name != "base": + if infos["type"] == SIMPLETYPE: + self.AddToLookupClass(name, parent, DefaultElementClass) + elif namespace == self.TargetNamespace: + self.AddToLookupClass(name, parent, type_name) if infos["type"] == COMPLEXTYPE: type_name, parent = self.SplitQualifiedName(type_name, namespace) result = self.CreateClass(type_name, parent, infos) @@ -1874,10 +1880,7 @@ else factory.etreeNamespaceFormat % element["name"]) initial = GetElementInitialValue(factory, element) if initial is not None: - for value in initial: - DefaultElementClass.__setattr__(value, "tag", element_name) - value.init() - self.append(value) + map(self.append, initial) return initMethod def generateSetMethod(attr): @@ -1894,16 +1897,16 @@ def addMethod(self): if infos["type"] == ATTRIBUTE: infos["attr_type"] = FindTypeInfos(factory, infos["attr_type"]) - initial = infos["attr_type"]["initial"] - extract = infos["attr_type"]["extract"] + if not infos.has_key("default"): + setattr(self, attr, infos["attr_type"]["initial"]()) elif infos["type"] == ELEMENT: infos["elmt_type"] = FindTypeInfos(factory, infos["elmt_type"]) - initial = infos["elmt_type"]["initial"] - extract = infos["elmt_type"]["extract"] + value = infos["elmt_type"]["initial"]() + DefaultElementClass.__setattr__(value, "tag", factory.etreeNamespaceFormat % attr) + setattr(self, attr, value) + value.init() else: raise ValueError("Invalid class attribute!") - if not infos.has_key("default"): - setattr(self, attr, initial()) return addMethod def generateDeleteMethod(attr):