| @@ -203,6 +203,9 @@ class DOMAdapter(DOMAdapterInterface): | |||
| self.__node = node | |||
| self.__attributes = None | |||
| def getNode(self): | |||
| return self.__node | |||
| def hasattr(self, attr, ns=None): | |||
| """attr -- attribute | |||
| ns -- optional namespace, None means unprefixed attribute. | |||
| @@ -918,6 +921,7 @@ class XMLSchema(XMLSchemaComponent): | |||
| notations -- collection of notations | |||
| """ | |||
| self.__node = None | |||
| self.targetNamespace = None | |||
| XMLSchemaComponent.__init__(self, parent) | |||
| f = lambda k: k.attributes['name'] | |||
| @@ -936,6 +940,12 @@ class XMLSchema(XMLSchemaComponent): | |||
| self._included_schemas = {} | |||
| self._base_url = None | |||
| def getNode(self): | |||
| """ | |||
| Interacting with the underlying DOM tree. | |||
| """ | |||
| return self.__node | |||
| def addImportSchema(self, schema): | |||
| """for resolving import statements in Schema instance | |||
| schema -- schema instance | |||
| @@ -1028,6 +1038,8 @@ class XMLSchema(XMLSchemaComponent): | |||
| return self.attributes.get('finalDefault') | |||
| def load(self, node): | |||
| self.__node = node | |||
| pnode = node.getParentNode() | |||
| if pnode: | |||
| pname = SplitQName(pnode.getTagName())[1] | |||
| @@ -1045,107 +1057,89 @@ class XMLSchema(XMLSchemaComponent): | |||
| self.setAttributes(node) | |||
| 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): | |||
| """<import> | |||
| @@ -1159,8 +1153,8 @@ class XMLSchema(XMLSchemaComponent): | |||
| annotation? | |||
| """ | |||
| attributes = {'id':None, | |||
| 'namespace':None, | |||
| 'schemaLocation':None} | |||
| 'namespace':None, | |||
| 'schemaLocation':None} | |||
| contents = {'xsd':['annotation']} | |||
| tag = 'import' | |||