xmlclass/xmlclass.py
changeset 1330 96b242e4c59d
parent 1322 0a9227f743b3
child 1385 816705d1e512
equal deleted inserted replaced
1328:a2f2981df9b0 1330:96b242e4c59d
  1728             return element_class[0]
  1728             return element_class[0]
  1729         return element_class
  1729         return element_class
  1730 
  1730 
  1731 class XMLClassParser(etree.XMLParser):
  1731 class XMLClassParser(etree.XMLParser):
  1732 
  1732 
  1733     def __init__(self, namespaces, default_namespace_format, base_class, *args, **kwargs):
  1733     def __init__(self, namespaces, default_namespace_format, base_class, xsd_schema, *args, **kwargs):
  1734         etree.XMLParser.__init__(self, *args, **kwargs)
  1734         etree.XMLParser.__init__(self, *args, **kwargs)
  1735         self.DefaultNamespaceFormat = default_namespace_format
  1735         self.DefaultNamespaceFormat = default_namespace_format
  1736         self.NSMAP = namespaces
  1736         self.NSMAP = namespaces
  1737         targetNamespace = etree.QName(default_namespace_format % "d").namespace
  1737         targetNamespace = etree.QName(default_namespace_format % "d").namespace
  1738         if targetNamespace is not None:
  1738         if targetNamespace is not None:
  1740                 name if targetNamespace != uri else None: uri
  1740                 name if targetNamespace != uri else None: uri
  1741                 for name, uri in namespaces.iteritems()}
  1741                 for name, uri in namespaces.iteritems()}
  1742         else:
  1742         else:
  1743             self.RootNSMAP = namespaces
  1743             self.RootNSMAP = namespaces
  1744         self.BaseClass = base_class
  1744         self.BaseClass = base_class
       
  1745         self.XSDSchema = xsd_schema
  1745     
  1746     
  1746     def set_element_class_lookup(self, class_lookup):
  1747     def set_element_class_lookup(self, class_lookup):
  1747         etree.XMLParser.set_element_class_lookup(self, class_lookup)
  1748         etree.XMLParser.set_element_class_lookup(self, class_lookup)
  1748         self.ClassLookup = class_lookup
  1749         self.ClassLookup = class_lookup
       
  1750     
       
  1751     def LoadXMLString(self, xml_string):
       
  1752         tree = etree.fromstring(xml_string, self)
       
  1753         if not self.XSDSchema.validate(tree):
       
  1754             error = self.XSDSchema.error_log.last_error
       
  1755             return tree, (error.line, error.message)
       
  1756         return tree, None 
  1749     
  1757     
  1750     def Dumps(self, xml_obj):
  1758     def Dumps(self, xml_obj):
  1751         return etree.tostring(xml_obj)
  1759         return etree.tostring(xml_obj)
  1752     
  1760     
  1753     def Loads(self, xml_string):
  1761     def Loads(self, xml_string):
  1791        
  1799        
  1792     parser = XMLClassParser(
  1800     parser = XMLClassParser(
  1793         factory.NSMAP,
  1801         factory.NSMAP,
  1794         factory.etreeNamespaceFormat,
  1802         factory.etreeNamespaceFormat,
  1795         BaseClass[0] if len(BaseClass) == 1 else None,
  1803         BaseClass[0] if len(BaseClass) == 1 else None,
  1796         schema = etree.XMLSchema(etree.fromstring(xsdstring)),
  1804         etree.XMLSchema(etree.fromstring(xsdstring)),
  1797         strip_cdata = False, remove_blank_text=True)
  1805         strip_cdata = False, remove_blank_text=True)
  1798     class_lookup = XMLElementClassLookUp(factory.ComputedClassesLookUp)
  1806     class_lookup = XMLElementClassLookUp(factory.ComputedClassesLookUp)
  1799     parser.set_element_class_lookup(class_lookup)
  1807     parser.set_element_class_lookup(class_lookup)
  1800     
  1808     
  1801     return parser
  1809     return parser