diff options
author | Atsushi Eno <atsushieno@gmail.com> | 2007-11-12 03:55:56 +0300 |
---|---|---|
committer | Atsushi Eno <atsushieno@gmail.com> | 2007-11-12 03:55:56 +0300 |
commit | b265ee6b99bb4547887aecc642889c87c6b13188 (patch) | |
tree | 4f1b82dc3fe829e476c42bb5e2b7467cbb9c365d /mcs/class/System.XML/System.Xml.Schema | |
parent | 4c551e6f7f1bdc4c041d66291d1639949ef39e9a (diff) |
2007-11-12 Atsushi Enomoto <atsushi@ximian.com>
* XmlSchemaValidator.cs : XmlValueGetter actually needs string value
to validate against a restricted simple type (beyond ParseValue()).
Fixed bug #339934.
* XsdValidatingReaderTests.cs : added test for #339934.
in Test/System.Xml.Schema/standalone_tests:
* Makefile : now we try both default and 2.0 profile tests (i.e.
"make run-test" and "make PROFILE=net_2_0").
For 2.0, use XmlReader.Create().
svn path=/trunk/mcs/; revision=89432
Diffstat (limited to 'mcs/class/System.XML/System.Xml.Schema')
-rw-r--r-- | mcs/class/System.XML/System.Xml.Schema/ChangeLog | 6 | ||||
-rw-r--r-- | mcs/class/System.XML/System.Xml.Schema/XmlSchemaValidator.cs | 91 |
2 files changed, 97 insertions, 0 deletions
diff --git a/mcs/class/System.XML/System.Xml.Schema/ChangeLog b/mcs/class/System.XML/System.Xml.Schema/ChangeLog index 9e89ee7e6e3..5fef8454ce7 100644 --- a/mcs/class/System.XML/System.Xml.Schema/ChangeLog +++ b/mcs/class/System.XML/System.Xml.Schema/ChangeLog @@ -1,3 +1,9 @@ +2007-11-12 Atsushi Enomoto <atsushi@ximian.com> + + * XmlSchemaValidator.cs : XmlValueGetter actually needs string value + to validate against a restricted simple type (beyond ParseValue()). + Fixed bug #339934. + 2007-11-05 Atsushi Enomoto <atsushi@ximian.com> * XmlSchemaSimpleTypeRestriction.cs : implemented value-space diff --git a/mcs/class/System.XML/System.Xml.Schema/XmlSchemaValidator.cs b/mcs/class/System.XML/System.Xml.Schema/XmlSchemaValidator.cs index 7584d066d64..b8935914799 100644 --- a/mcs/class/System.XML/System.Xml.Schema/XmlSchemaValidator.cs +++ b/mcs/class/System.XML/System.Xml.Schema/XmlSchemaValidator.cs @@ -790,6 +790,12 @@ namespace System.Xml.Schema } catch (Exception ex) { // It is inevitable and bad manner. HandleError ("Attribute value is invalid against its data type " + dt.TokenizedType, ex); } + + // check part of 3.14.4 StringValid + SimpleType st = attr.AttributeType as SimpleType; + if (st != null) + ValidateRestrictedSimpleTypeValue (st, ref dt, new XmlAtomicValue (parsedValue, attr.AttributeSchemaType).Value); + XmlSchemaType type = info != null ? info.SchemaType : null; if (attr.ValidatedFixedValue != null && !XmlSchemaUtil.IsSchemaDatatypeEquals ( @@ -1055,6 +1061,91 @@ namespace System.Xml.Schema return ret; } + private void ValidateRestrictedSimpleTypeValue (SimpleType st, ref XsDatatype dt, string normalized) + { + { + string [] values; + XsDatatype itemDatatype; + SimpleType itemSimpleType; + switch (st.DerivedBy) { + case XmlSchemaDerivationMethod.List: + SimpleTypeList listContent = st.Content as SimpleTypeList; + values = normalized.Split (XmlChar.WhitespaceChars); + itemDatatype = listContent.ValidatedListItemType as XsDatatype; + itemSimpleType = listContent.ValidatedListItemType as SimpleType; + for (int vi = 0; vi < values.Length; vi++) { + string each = values [vi]; + if (each == String.Empty) + continue; + // validate against ValidatedItemType + if (itemDatatype != null) { + try { + itemDatatype.ParseValue (each, nameTable, nsResolver); + } catch (Exception ex) { // FIXME: (wishlist) better exception handling ;-( + HandleError ("List type value contains one or more invalid values.", ex); + break; + } + } + else + AssessStringValid (itemSimpleType, itemSimpleType.Datatype, each); + } + break; + case XmlSchemaDerivationMethod.Union: + SimpleTypeUnion union = st.Content as SimpleTypeUnion; + { + string each = normalized; + // validate against ValidatedItemType + bool passed = false; + foreach (object eachType in union.ValidatedTypes) { + itemDatatype = eachType as XsDatatype; + itemSimpleType = eachType as SimpleType; + if (itemDatatype != null) { + try { + itemDatatype.ParseValue (each, nameTable, nsResolver); + } catch (Exception) { // FIXME: (wishlist) better exception handling ;-( + continue; + } + } + else { + try { + AssessStringValid (itemSimpleType, itemSimpleType.Datatype, each); + } catch (ValException) { + continue; + } + } + passed = true; + break; + } + if (!passed) { + HandleError ("Union type value contains one or more invalid values."); + break; + } + } + break; + case XmlSchemaDerivationMethod.Restriction: + SimpleTypeRest str = st.Content as SimpleTypeRest; + // facet validation + if (str != null) { + /* Don't forget to validate against inherited type's facets + * Could we simplify this by assuming that the basetype will also + * be restriction? + * */ + // mmm, will check later. + SimpleType baseType = st.BaseXmlSchemaType as SimpleType; + if (baseType != null) { + AssessStringValid(baseType, dt, normalized); + } + if (!str.ValidateValueWithFacets (normalized, nameTable, nsResolver)) { + HandleError ("Specified value was invalid against the facets."); + break; + } + } + dt = st.Datatype; + break; + } + } + } + #endregion #region Key Constraints Validation |