Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAtsushi Eno <atsushieno@gmail.com>2007-11-12 03:55:56 +0300
committerAtsushi Eno <atsushieno@gmail.com>2007-11-12 03:55:56 +0300
commitb265ee6b99bb4547887aecc642889c87c6b13188 (patch)
tree4f1b82dc3fe829e476c42bb5e2b7467cbb9c365d /mcs/class/System.XML/System.Xml.Schema
parent4c551e6f7f1bdc4c041d66291d1639949ef39e9a (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/ChangeLog6
-rw-r--r--mcs/class/System.XML/System.Xml.Schema/XmlSchemaValidator.cs91
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