xmlclass/xmlclass.py
changeset 1293 40117d02601b
parent 1291 42ea51d083ce
child 1294 f02ba5b83811
--- 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):