diff options
author | Peter A. Bigot <pabigot@users.sourceforge.net> | 2010-05-29 15:42:37 -0500 |
---|---|---|
committer | Peter A. Bigot <pabigot@users.sourceforge.net> | 2010-05-29 15:42:37 -0500 |
commit | fa730ddf94a04d8c88327e28375ff36c57a8819f (patch) | |
tree | 1c66048a89bd1e0384ae00b4cae2c01b8d31114b | |
parent | 922f23248111fb3f31b1d60cf439761aab95e9a5 (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.py | 32 | ||||
-rw-r--r-- | tests/drivers/test-ctd-extension.py | 6 |
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) |