@@ -20,6 +20,16 @@ from Namespaces import XMLNS
from Utility import DOM, DOMException, Collection, SplitQName, basejoin
from StringIO import StringIO
#
# Collections in XMLSchema class
#
TYPES = 'types'
ATTRIBUTE_GROUPS = 'attr_groups'
ATTRIBUTES = 'attr_decl'
ELEMENTS = 'elements'
MODEL_GROUPS = 'model_groups'
def GetSchema(component):
"""convience function for finding the parent XMLSchema instance.
"""
@@ -519,31 +529,31 @@ class XMLSchemaComponent(XMLBase, MarkerInterface):
"""attribute -- attribute with a QName value (eg. type).
collection -- check types collection in parent Schema instance
"""
return self.getQNameAttribute('attr_decl' , attribute)
return self.getQNameAttribute(ATTRIBUTES , attribute)
def getAttributeGroup(self, attribute):
"""attribute -- attribute with a QName value (eg. type).
collection -- check types collection in parent Schema instance
"""
return self.getQNameAttribute('attr_groups' , attribute)
return self.getQNameAttribute(ATTRIBUTE_GROUPS , attribute)
def getTypeDefinition(self, attribute):
"""attribute -- attribute with a QName value (eg. type).
collection -- check types collection in parent Schema instance
"""
return self.getQNameAttribute('types' , attribute)
return self.getQNameAttribute(TYPES , attribute)
def getElementDeclaration(self, attribute):
"""attribute -- attribute with a QName value (eg. element).
collection -- check elements collection in parent Schema instance.
"""
return self.getQNameAttribute('elements' , attribute)
return self.getQNameAttribute(ELEMENTS , attribute)
def getModelGroup(self, attribute):
"""attribute -- attribute with a QName value (eg. ref).
collection -- check model_group collection in parent Schema instance.
"""
return self.getQNameAttribute('model_groups' , attribute)
return self.getQNameAttribute(MODEL_GROUPS , attribute)
def getQNameAttribute(self, collection, attribute):
"""returns object instance representing QName --> (namespace,name),
@@ -552,25 +562,35 @@ class XMLSchemaComponent(XMLBase, MarkerInterface):
collection -- collection in parent Schema instance to search.
"""
obj = None
tdc = self.attributes.get(attribute)
#tdc = self.attributes.get(attribute)
tdc = self.getAttributeQName(attribute)
if tdc:
parent = GetSchema(self)
targetNamespace = tdc.getTargetNamespace()
if parent.targetNamespace == targetNamespace:
item = tdc.getName()
try:
obj = getattr(parent, collection)[item]
except KeyError, ex:
raise KeyError, "targetNamespace(%s) collection(%s) has no item(%s)"\
%(targetNamespace, collection, item)
elif parent.imports.has_key(targetNamespace):
schema = parent.imports[targetNamespace].getSchema()
item = tdc.getName()
try:
obj = getattr(schema, collection)[item]
except KeyError, ex:
raise KeyError, "targetNamespace(%s) collection(%s) has no item(%s)"\
%(targetNamespace, collection, item)
obj = self.getSchemaItem(collection, tdc.getTargetNamespace(), tdc.getName())
return obj
def getSchemaItem(self, collection, namespace, name):
"""returns object instance representing namespace, name,
or if does not exist return None.
namespace -- namespace item defined in.
name -- name of item.
collection -- collection in parent Schema instance to search.
"""
obj = None
parent = GetSchema(self)
if parent.targetNamespace == namespace:
try:
obj = getattr(parent, collection)[name]
except KeyError, ex:
raise KeyError, "targetNamespace(%s) collection(%s) has no item(%s)"\
%(namespace, collection, name)
elif parent.imports.has_key(namespace):
schema = parent.imports[namespace].getSchema()
try:
obj = getattr(schema, collection)[name]
except KeyError, ex:
raise KeyError, "targetNamespace(%s) collection(%s) has no item(%s)"\
%(namespace, collection, name)
return obj
def getXMLNS(self, prefix=None):
@@ -608,10 +628,12 @@ class XMLSchemaComponent(XMLBase, MarkerInterface):
qname = self.getAttribute(attribute)
if isinstance(qname, TypeDescriptionComponent) is True:
return qname
if qname is None:
return None
prefix,ncname = SplitQName(qname)
namespace = self.getXMLNS(prefix)
return (namespace,ncname)
return TypeDescriptionComponent( (namespace,ncname))
def getAttributeName(self):
"""return attribute name or None
@@ -1538,7 +1560,7 @@ class AttributeGroupReference(XMLSchemaComponent,\
"""attribute -- attribute with a QName value (eg. type).
collection -- check types collection in parent Schema instance
"""
return XMLSchemaComponent.getQName Attribute(self, 'attr_groups' , attribute)
return XMLSchemaComponent.getAttributeGroup (self, attribute)
def fromDom(self, node):
self.setAttributes(node)