| @@ -203,6 +203,9 @@ class DOMAdapter(DOMAdapterInterface): | |||||
| self.__node = node | self.__node = node | ||||
| self.__attributes = None | self.__attributes = None | ||||
| def getNode(self): | |||||
| return self.__node | |||||
| def hasattr(self, attr, ns=None): | def hasattr(self, attr, ns=None): | ||||
| """attr -- attribute | """attr -- attribute | ||||
| ns -- optional namespace, None means unprefixed attribute. | ns -- optional namespace, None means unprefixed attribute. | ||||
| @@ -918,6 +921,7 @@ class XMLSchema(XMLSchemaComponent): | |||||
| notations -- collection of notations | notations -- collection of notations | ||||
| """ | """ | ||||
| self.__node = None | |||||
| self.targetNamespace = None | self.targetNamespace = None | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| f = lambda k: k.attributes['name'] | f = lambda k: k.attributes['name'] | ||||
| @@ -936,6 +940,12 @@ class XMLSchema(XMLSchemaComponent): | |||||
| self._included_schemas = {} | self._included_schemas = {} | ||||
| self._base_url = None | self._base_url = None | ||||
| def getNode(self): | |||||
| """ | |||||
| Interacting with the underlying DOM tree. | |||||
| """ | |||||
| return self.__node | |||||
| def addImportSchema(self, schema): | def addImportSchema(self, schema): | ||||
| """for resolving import statements in Schema instance | """for resolving import statements in Schema instance | ||||
| schema -- schema instance | schema -- schema instance | ||||
| @@ -1028,6 +1038,8 @@ class XMLSchema(XMLSchemaComponent): | |||||
| return self.attributes.get('finalDefault') | return self.attributes.get('finalDefault') | ||||
| def load(self, node): | def load(self, node): | ||||
| self.__node = node | |||||
| pnode = node.getParentNode() | pnode = node.getParentNode() | ||||
| if pnode: | if pnode: | ||||
| pname = SplitQName(pnode.getTagName())[1] | pname = SplitQName(pnode.getTagName())[1] | ||||
| @@ -1045,107 +1057,89 @@ class XMLSchema(XMLSchemaComponent): | |||||
| self.setAttributes(node) | self.setAttributes(node) | ||||
| self.targetNamespace = self.getTargetNamespace() | self.targetNamespace = self.getTargetNamespace() | ||||
| contents = self.getContents(node) | |||||
| indx = 0 | |||||
| num = len(contents) | |||||
| while indx < num: | |||||
| while indx < num: | |||||
| node = contents[indx] | |||||
| component = SplitQName(node.getTagName())[1] | |||||
| if component == 'include': | |||||
| tp = self.__class__.Include(self) | |||||
| tp.fromDom(node) | |||||
| self.includes[tp.attributes['schemaLocation']] = tp | |||||
| schema = tp.getSchema() | |||||
| if schema.targetNamespace and \ | |||||
| schema.targetNamespace != self.targetNamespace: | |||||
| raise SchemaError, 'included schema bad targetNamespace' | |||||
| for collection in ['imports','elements','types',\ | |||||
| 'attr_decl','attr_groups','model_groups','notations']: | |||||
| for k,v in getattr(schema,collection).items(): | |||||
| if not getattr(self,collection).has_key(k): | |||||
| v._parent = weakref.ref(self) | |||||
| getattr(self,collection)[k] = v | |||||
| elif component == 'import': | |||||
| tp = self.__class__.Import(self) | |||||
| tp.fromDom(node) | |||||
| import_ns = tp.getAttribute('namespace') | |||||
| if import_ns: | |||||
| if import_ns == self.targetNamespace: | |||||
| raise SchemaError,\ | |||||
| 'import and schema have same targetNamespace' | |||||
| self.imports[import_ns] = tp | |||||
| else: | |||||
| self.imports[self.__class__.empty_namespace] = tp | |||||
| if not self.getImportSchemas().has_key(import_ns) and\ | |||||
| tp.getAttribute('schemaLocation'): | |||||
| self.addImportSchema(tp.getSchema()) | |||||
| for childNode in self.getContents(node): | |||||
| component = SplitQName(childNode.getTagName())[1] | |||||
| if component == 'include': | |||||
| tp = self.__class__.Include(self) | |||||
| tp.fromDom(childNode) | |||||
| sl = tp.attributes['schemaLocation'] | |||||
| schema = tp.getSchema() | |||||
| if not self.getIncludeSchemas().has_key(sl): | |||||
| self.addIncludeSchema(sl, schema) | |||||
| self.includes[sl] = tp | |||||
| # This is the test code | |||||
| pn = childNode.getParentNode().getNode() | |||||
| pn.removeChild(childNode.getNode()) | |||||
| for child in schema.getNode().getNode().childNodes: | |||||
| pn.appendChild(child.cloneNode(1)) | |||||
| # end of test code | |||||
| for collection in ['imports','elements','types', | |||||
| 'attr_decl','attr_groups','model_groups', | |||||
| 'notations']: | |||||
| for k,v in getattr(schema,collection).items(): | |||||
| if not getattr(self,collection).has_key(k): | |||||
| v._parent = weakref.ref(self) | |||||
| getattr(self,collection)[k] = v | |||||
| else: | |||||
| print "Warning: Not keeping schema component." | |||||
| elif component == 'redefine': | |||||
| #print_debug('class %s, redefine skipped' %self.__class__, 5) | |||||
| pass | |||||
| elif component == 'annotation': | |||||
| #print_debug('class %s, annotation skipped' %self.__class__, 5) | |||||
| pass | |||||
| else: | |||||
| break | |||||
| indx += 1 | |||||
| elif component == 'import': | |||||
| tp = self.__class__.Import(self) | |||||
| tp.fromDom(childNode) | |||||
| # (attribute, attributeGroup, complexType, element, group, | |||||
| # notation, simpleType)*, annotation*)* | |||||
| while indx < num: | |||||
| node = contents[indx] | |||||
| component = SplitQName(node.getTagName())[1] | |||||
| import_ns = tp.getAttribute('namespace') or \ | |||||
| self.__class__.empty_namespace | |||||
| if component == 'attribute': | |||||
| tp = AttributeDeclaration(self) | |||||
| tp.fromDom(node) | |||||
| self.attr_decl[tp.getAttribute('name')] = tp | |||||
| elif component == 'attributeGroup': | |||||
| tp = AttributeGroupDefinition(self) | |||||
| tp.fromDom(node) | |||||
| self.attr_groups[tp.getAttribute('name')] = tp | |||||
| elif component == 'complexType': | |||||
| tp = ComplexType(self) | |||||
| tp.fromDom(node) | |||||
| self.types[tp.getAttribute('name')] = tp | |||||
| elif component == 'element': | |||||
| tp = ElementDeclaration(self) | |||||
| tp.fromDom(node) | |||||
| self.elements[tp.getAttribute('name')] = tp | |||||
| elif component == 'group': | |||||
| tp = ModelGroupDefinition(self) | |||||
| tp.fromDom(node) | |||||
| self.model_groups[tp.getAttribute('name')] = tp | |||||
| elif component == 'notation': | |||||
| tp = Notation(self) | |||||
| tp.fromDom(node) | |||||
| self.notations[tp.getAttribute('name')] = tp | |||||
| elif component == 'simpleType': | |||||
| tp = SimpleType(self) | |||||
| tp.fromDom(node) | |||||
| self.types[tp.getAttribute('name')] = tp | |||||
| else: | |||||
| break | |||||
| indx += 1 | |||||
| while indx < num: | |||||
| node = contents[indx] | |||||
| component = SplitQName(node.getTagName())[1] | |||||
| if component == 'annotation': | |||||
| #print_debug('class %s, annotation 2 skipped' %self.__class__, 5) | |||||
| pass | |||||
| else: | |||||
| break | |||||
| indx += 1 | |||||
| if not self.getImportSchemas().has_key(import_ns) and \ | |||||
| tp.getAttribute('schemaLocation'): | |||||
| self.addImportSchema(tp.getSchema()) | |||||
| self.imports[import_ns] = tp | |||||
| elif component == 'redefine': | |||||
| # redefine not implemented yet | |||||
| pass | |||||
| elif component == 'annotation': | |||||
| # annotation not implemented yet | |||||
| pass | |||||
| elif component == 'attribute': | |||||
| tp = AttributeDeclaration(self) | |||||
| tp.fromDom(childNode) | |||||
| self.attr_decl[tp.getAttribute('name')] = tp | |||||
| elif component == 'attributeGroup': | |||||
| tp = AttributeGroupDefinition(self) | |||||
| tp.fromDom(childNode) | |||||
| self.attr_groups[tp.getAttribute('name')] = tp | |||||
| elif component == 'element': | |||||
| tp = ElementDeclaration(self) | |||||
| tp.fromDom(childNode) | |||||
| self.elements[tp.getAttribute('name')] = tp | |||||
| elif component == 'group': | |||||
| tp = ModelGroupDefinition(self) | |||||
| tp.fromDom(childNode) | |||||
| self.model_groups[tp.getAttribute('name')] = tp | |||||
| elif component == 'notation': | |||||
| tp = Notation(self) | |||||
| tp.fromDom(childNode) | |||||
| self.notations[tp.getAttribute('name')] = tp | |||||
| elif component == 'complexType': | |||||
| tp = ComplexType(self) | |||||
| tp.fromDom(childNode) | |||||
| self.types[tp.getAttribute('name')] = tp | |||||
| elif component == 'simpleType': | |||||
| tp = SimpleType(self) | |||||
| tp.fromDom(childNode) | |||||
| self.types[tp.getAttribute('name')] = tp | |||||
| else: | |||||
| break | |||||
| # indx += 1 | |||||
| class Import(XMLSchemaComponent): | class Import(XMLSchemaComponent): | ||||
| """<import> | """<import> | ||||
| @@ -1159,8 +1153,8 @@ class XMLSchema(XMLSchemaComponent): | |||||
| annotation? | annotation? | ||||
| """ | """ | ||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'namespace':None, | |||||
| 'schemaLocation':None} | |||||
| 'namespace':None, | |||||
| 'schemaLocation':None} | |||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'import' | tag = 'import' | ||||