summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter A. Bigot <pabigot@users.sourceforge.net>2010-05-29 15:42:37 -0500
committerPeter A. Bigot <pabigot@users.sourceforge.net>2010-05-29 15:42:37 -0500
commitfa730ddf94a04d8c88327e28375ff36c57a8819f (patch)
tree1c66048a89bd1e0384ae00b4cae2c01b8d31114b
parent922f23248111fb3f31b1d60cf439761aab95e9a5 (diff)
Just enough wildcard validation to make the content work.
In the past, wildcards were tried as a last resort; now they're done in the right place, which means that we need to apply namespace constraints lest invalid elements be improperly recognized as wildcards, throwing off the entire content model.
-rw-r--r--pyxb/binding/content.py32
-rw-r--r--tests/drivers/test-ctd-extension.py6
2 files changed, 30 insertions, 8 deletions
diff --git a/pyxb/binding/content.py b/pyxb/binding/content.py
index 2340f98..d3b08ec 100644
--- a/pyxb/binding/content.py
+++ b/pyxb/binding/content.py
@@ -911,13 +911,35 @@ class Wildcard (ContentState_mixin):
self.__namespaceConstraint = kw['namespace_constraint']
self.__processContents = kw['process_contents']
- def matches (self, instance_instance, value):
+ def matches (self, instance, value):
"""Return True iff the value is a valid match against this wildcard.
- Not implemented yet: all wildcards are assumed to match all values.
-
+ Validation per U{Wildcard allows Namespace Name<http://www.w3.org/TR/xmlschema-1/#cvc-wildcard-namespace>}.
"""
- return True
+
+ ns = None
+ if isinstance(value, xml.dom.Node):
+ if value.namespaceURI is not None:
+ ns = pyxb.namespace.NamespaceForURI(value.namespaceURI)
+ elif isinstance(value, basis._TypeBinding_mixin):
+ elt = value._element()
+ if elt is not None:
+ ns = elt.name().namespace()
+ else:
+ raise pyxb.LogicError('Need namespace')
+ else:
+ raise pyxb.LogicError('Need namespace')
+ if self.NC_any == self.__namespaceConstraint:
+ return True
+ if isinstance(self.__namespaceConstraint, tuple):
+ (_, constrained_ns) = self.__namespaceConstraint
+ assert self.NC_not == _
+ if constrained_ns == ns:
+ return False
+ if ns.isAbsentNamespace():
+ return False
+ return True
+ return ns in self.__namespaceConstraint
def newState (self, parent_particle_state):
return self
@@ -925,7 +947,7 @@ class Wildcard (ContentState_mixin):
def accepts (self, particle_state, instance, value, element_use):
value_desc = 'value of type %s' % (type(value),)
if not self.matches(instance, value):
- raise pyxb.UnexpectedContentError(value)
+ return False
if not isinstance(value, basis._TypeBinding_mixin):
print 'NOTE: Created unbound wildcard element from %s' % (value_desc,)
assert isinstance(instance.wildcardElements(), list), 'Uninitialized wildcard list in %s' % (instance._ExpandedName,)
diff --git a/tests/drivers/test-ctd-extension.py b/tests/drivers/test-ctd-extension.py
index fd75642..590f8bb 100644
--- a/tests/drivers/test-ctd-extension.py
+++ b/tests/drivers/test-ctd-extension.py
@@ -56,7 +56,7 @@ class TestCTDExtension (unittest.TestCase):
self.assertEqual('add generation', instance.eAttr)
def testMidWildcard (self):
- xml = '<defs><documentation/><something/><message/><message/><import/><message/></defs>'
+ xml = '<defs xmlns:other="other"><documentation/><other:something/><message/><message/><import/><message/></defs>'
doc = pyxb.utils.domutils.StringToDOM(xml)
instance = defs.createFromDOM(doc.documentElement)
self.assertFalse(instance.documentation is None)
@@ -64,7 +64,7 @@ class TestCTDExtension (unittest.TestCase):
self.assertEqual(1, len(instance.import_))
self.assertEqual(1, len(instance.wildcardElements()))
- xml = '<defs><something/><else/><message/><message/><import/><message/></defs>'
+ xml = '<defs xmlns:other="other"><other:something/><other:else/><message/><message/><import/><message/></defs>'
doc = pyxb.utils.domutils.StringToDOM(xml)
instance = defs.createFromDOM(doc.documentElement)
self.assertTrue(instance.documentation is None)
@@ -73,7 +73,7 @@ class TestCTDExtension (unittest.TestCase):
self.assertEqual(2, len(instance.wildcardElements()))
def testEndWildcard (self):
- xml = '<defs><message/><something/></defs>'
+ xml = '<defs xmlns:other="other"><message/><other:something/></defs>'
doc = pyxb.utils.domutils.StringToDOM(xml)
self.assertRaises(ExtraContentError, defs.createFromDOM, doc.documentElement)