xmlclass/xmlclass.py
changeset 607 9c133d675b69
parent 603 25c92309cdae
child 616 8a60ffcfd70b
equal deleted inserted replaced
606:d65122c61eaf 607:9c133d675b69
   555         "generate": GenerateAny,
   555         "generate": GenerateAny,
   556         "initial": lambda: "",
   556         "initial": lambda: "",
   557         "check": lambda x: isinstance(x, (StringType, UnicodeType, minidom.Node))
   557         "check": lambda x: isinstance(x, (StringType, UnicodeType, minidom.Node))
   558     }
   558     }
   559 
   559 
   560 def GenerateTagInfos(name):
   560 def GenerateTagInfos(infos):
   561     def ExtractTag(tree):
   561     def ExtractTag(tree):
   562         if len(tree._attrs) > 0:
   562         if len(tree._attrs) > 0:
   563             raise ValueError("\"%s\" musn't have attributes!" % name)
   563             raise ValueError("\"%s\" musn't have attributes!" % infos["name"])
   564         if len(tree.childNodes) > 0:
   564         if len(tree.childNodes) > 0:
   565             raise ValueError("\"%s\" musn't have children!" % name)
   565             raise ValueError("\"%s\" musn't have children!" % infos["name"])
   566         return None
   566         if infos["minOccurs"] == 0:
       
   567             return True
       
   568         else:
       
   569             return None
   567     
   570     
   568     def GenerateTag(value, name=None, indent=0):
   571     def GenerateTag(value, name=None, indent=0):
   569         if name is not None:
   572         if name is not None and not (infos["minOccurs"] == 0 and value is None):
   570             ind1, ind2 = getIndent(indent, name)
   573             ind1, ind2 = getIndent(indent, name)
   571             return ind1 + "<%s/>\n" % name
   574             return ind1 + "<%s/>\n" % name
   572         else:
   575         else:
   573             return ""
   576             return ""
   574     
   577     
   575     return {
   578     return {
   576         "type": TAG, 
   579         "type": TAG, 
   577         "extract": ExtractTag,
   580         "extract": ExtractTag,
   578         "generate": GenerateTag,
   581         "generate": GenerateTag,
   579         "initial": lambda: None,
   582         "initial": lambda: None,
   580         "check": lambda x: x == None
   583         "check": lambda x: x == None or infos["minOccurs"] == 0 and value == True
   581     }
   584     }
   582 
   585 
   583 def FindTypeInfos(factory, infos):
   586 def FindTypeInfos(factory, infos):
   584     if isinstance(infos, (UnicodeType, StringType)):
   587     if isinstance(infos, (UnicodeType, StringType)):
   585         namespace, name = DecomposeQualifiedName(infos)
   588         namespace, name = DecomposeQualifiedName(infos)
   643                 if sequence_element["type"] != CHOICE:
   646                 if sequence_element["type"] != CHOICE:
   644                     element_infos = factory.ExtractTypeInfos(sequence_element["name"], name, sequence_element["elmt_type"])
   647                     element_infos = factory.ExtractTypeInfos(sequence_element["name"], name, sequence_element["elmt_type"])
   645                     if element_infos is not None:
   648                     if element_infos is not None:
   646                         sequence_element["elmt_type"] = element_infos
   649                         sequence_element["elmt_type"] = element_infos
   647         elif choice["elmt_type"] == "tag":
   650         elif choice["elmt_type"] == "tag":
   648             choice["elmt_type"] = GenerateTagInfos(choice["name"])
   651             choice["elmt_type"] = GenerateTagInfos(choice)
   649         else:
   652         else:
   650             choice_infos = factory.ExtractTypeInfos(choice["name"], name, choice["elmt_type"])
   653             choice_infos = factory.ExtractTypeInfos(choice["name"], name, choice["elmt_type"])
   651             if choice_infos is not None:
   654             if choice_infos is not None:
   652                 choice["elmt_type"] = choice_infos
   655                 choice["elmt_type"] = choice_infos
   653         choices.append((choice["name"], choice))
   656         choices.append((choice["name"], choice))
  1187                 elmtname = element["name"] = "text"
  1190                 elmtname = element["name"] = "text"
  1188                 element["minOccurs"] = element["maxOccurs"] = 1
  1191                 element["minOccurs"] = element["maxOccurs"] = 1
  1189                 infos = GenerateAnyInfos(element)
  1192                 infos = GenerateAnyInfos(element)
  1190             else:
  1193             else:
  1191                 elmtname = element["name"]
  1194                 elmtname = element["name"]
  1192                 infos = self.ExtractTypeInfos(element["name"], name, element["elmt_type"])
  1195                 if element["elmt_type"] == "tag":
       
  1196                     infos = GenerateTagInfos(element)
       
  1197                 else:
       
  1198                     infos = self.ExtractTypeInfos(element["name"], name, element["elmt_type"])
  1193             if infos is not None:
  1199             if infos is not None:
  1194                 element["elmt_type"] = infos
  1200                 element["elmt_type"] = infos
  1195             if element["maxOccurs"] == "unbounded" or element["maxOccurs"] > 1:
  1201             if element["maxOccurs"] == "unbounded" or element["maxOccurs"] > 1:
  1196                 classmembers[elmtname] = []
  1202                 classmembers[elmtname] = []
  1197                 classmembers["append%s" % elmtname] = generateAppendMethod(elmtname, element["maxOccurs"], self, element)
  1203                 classmembers["append%s" % elmtname] = generateAppendMethod(elmtname, element["maxOccurs"], self, element)