2 // System.Xml.Schema.XmlSchemaDatatype.cs
7 // (C)2003 Atsushi Enomoto
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System
.Collections
;
34 using System
.Xml
.Schema
;
35 using System
.Globalization
;
36 using System
.Security
.Cryptography
;
39 using NSResolver
= System
.Xml
.IXmlNamespaceResolver
;
41 using NSResolver
= System
.Xml
.XmlNamespaceManager
;
45 namespace Mono
.Xml
.Schema
47 internal enum XsdWhitespaceFacet
54 internal enum XsdOrderedFacet
61 internal enum XsdOrdering
69 internal class XsdAnySimpleType
: XmlSchemaDatatype
71 static XsdAnySimpleType instance
;
72 static XsdAnySimpleType ()
74 instance
= new XsdAnySimpleType ();
77 public static XsdAnySimpleType Instance
{
78 get { return instance; }
81 protected XsdAnySimpleType ()
86 public override XmlTypeCode TypeCode
{
87 get { return XmlTypeCode.AnyAtomicType; }
91 static readonly char [] whitespaceArray
= new char [] {' '}
;
94 public virtual bool Bounded
{
98 public virtual bool Finite
{
102 public virtual bool Numeric
{
103 get { return false; }
106 public virtual XsdOrderedFacet Ordered
{
107 get { return XsdOrderedFacet.False; }
110 public override Type ValueType
{
112 if (XmlSchemaUtil
.StrictMsCompliant
)
113 return typeof (string);
115 return typeof (object);
119 public override XmlTokenizedType TokenizedType
{
121 return XmlTokenizedType
.None
;
125 public override object ParseValue (string s
,
126 XmlNameTable nameTable
, NSResolver nsmgr
)
128 return Normalize (s
);
131 internal override ValueType
ParseValueType (string s
,
132 XmlNameTable nameTable
, NSResolver nsmgr
)
134 return new StringValueType (Normalize (s
));
137 internal string [] ParseListValue (string s
, XmlNameTable nameTable
)
139 return this.Normalize (s
, XsdWhitespaceFacet
.Collapse
).Split (whitespaceArray
);
144 // Can you even use XsdAnySimpleType in a schema?
145 // -> Yes. See E1-22 of http://www.w3.org/2001/05/xmlschema-errata#Errata1 (somewhat paranoid ;-)
147 internal bool AllowsFacet(XmlSchemaFacet xsf
) {
148 return (AllowedFacets
& xsf
.ThisFacet
)!=0;
153 internal virtual XsdOrdering
Compare(object x
, object y
) {
154 return XsdOrdering
.Indeterminate
;
157 internal virtual int Length(string s
) {
162 // anySimpleType allows any facet
163 internal virtual XmlSchemaFacet
.Facet AllowedFacets
{
164 get { return XmlSchemaFacet.AllFacets ;}
167 /* Matches facets allowed on boolean type
169 internal static readonly XmlSchemaFacet
.Facet booleanAllowedFacets
=
170 XmlSchemaFacet
.Facet
.pattern
| XmlSchemaFacet
.Facet
.whiteSpace
;
172 /* Matches facets allowed on decimal type.
174 internal static readonly XmlSchemaFacet
.Facet decimalAllowedFacets
=
175 XmlSchemaFacet
.Facet
.pattern
| XmlSchemaFacet
.Facet
.enumeration
|
176 XmlSchemaFacet
.Facet
.whiteSpace
| XmlSchemaFacet
.Facet
.maxInclusive
|
177 XmlSchemaFacet
.Facet
.minInclusive
| XmlSchemaFacet
.Facet
.maxExclusive
|
178 XmlSchemaFacet
.Facet
.minExclusive
| XmlSchemaFacet
.Facet
.fractionDigits
|
179 XmlSchemaFacet
.Facet
.totalDigits
;
181 /* Matches facets allowed on float, double, duration, dateTime, time, date,
182 * gYearMonth, gYear, gMonthDay, gMonth, and gDay types
185 internal static readonly XmlSchemaFacet
.Facet durationAllowedFacets
=
186 XmlSchemaFacet
.Facet
.pattern
| XmlSchemaFacet
.Facet
.enumeration
|
187 XmlSchemaFacet
.Facet
.whiteSpace
| XmlSchemaFacet
.Facet
.maxInclusive
|
188 XmlSchemaFacet
.Facet
.minInclusive
| XmlSchemaFacet
.Facet
.maxExclusive
|
189 XmlSchemaFacet
.Facet
.minExclusive
;
191 /* Matches facet allowed on string, hexBinary, base64Binary,
192 * anyURI, QName and NOTATION types
194 * Also used on list types
197 internal static readonly XmlSchemaFacet
.Facet stringAllowedFacets
=
198 XmlSchemaFacet
.Facet
.length
| XmlSchemaFacet
.Facet
.minLength
|
199 XmlSchemaFacet
.Facet
.maxLength
| XmlSchemaFacet
.Facet
.pattern
|
200 XmlSchemaFacet
.Facet
.enumeration
| XmlSchemaFacet
.Facet
.whiteSpace
;
204 internal class XdtAnyAtomicType
: XsdAnySimpleType
206 internal XdtAnyAtomicType ()
210 public override XmlTypeCode TypeCode
{
211 get { return XmlTypeCode.AnyAtomicType; }
215 internal class XdtUntypedAtomic
: XdtAnyAtomicType
217 internal XdtUntypedAtomic ()
221 public override XmlTypeCode TypeCode
{
222 get { return XmlTypeCode.UntypedAtomic; }
228 internal class XsdString
: XsdAnySimpleType
230 internal XsdString ()
234 internal override XmlSchemaFacet
.Facet AllowedFacets
{
235 get { return stringAllowedFacets; }
238 public override XmlTokenizedType TokenizedType
{
239 get { return XmlTokenizedType.CDATA; }
243 public override XmlTypeCode TypeCode
{
244 get { return XmlTypeCode.String; }
248 public override Type ValueType
{
249 get { return typeof (string); }
252 // Fundamental Facets
253 public override bool Bounded
{
254 get { return false; }
256 public override bool Finite
{
257 get { return false; }
259 public override bool Numeric
{
260 get { return false; }
262 public override XsdOrderedFacet Ordered
{
263 get { return XsdOrderedFacet.False; }
268 // xs:normalizedString
269 internal class XsdNormalizedString
: XsdString
271 internal XsdNormalizedString ()
273 this.WhitespaceValue
= XsdWhitespaceFacet
.Replace
;
276 public override XmlTokenizedType TokenizedType
{
278 get { return XmlTokenizedType.CDATA; }
282 public override XmlTypeCode TypeCode
{
283 get { return XmlTypeCode.NormalizedString; }
287 public override Type ValueType
{
288 get { return typeof (string); }
291 // ParseValue () method is as same as that of xs:string
295 internal class XsdToken
: XsdNormalizedString
299 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
302 public override XmlTokenizedType TokenizedType
{
303 get { return XmlTokenizedType.CDATA; }
307 public override XmlTypeCode TypeCode
{
308 get { return XmlTypeCode.Token; }
312 public override Type ValueType
{
313 get { return typeof (string); }
316 // ParseValue () method is as same as that of xs:string
320 internal class XsdLanguage
: XsdToken
322 internal XsdLanguage ()
326 public override XmlTokenizedType TokenizedType
{
327 get { return XmlTokenizedType.CDATA; }
331 public override XmlTypeCode TypeCode
{
332 get { return XmlTypeCode.Language; }
336 public override Type ValueType
{
337 get { return typeof (string); }
340 // ParseValue () method is as same as that of xs:string
344 internal class XsdNMToken
: XsdToken
346 internal XsdNMToken ()
350 public override XmlTokenizedType TokenizedType
{
351 get { return XmlTokenizedType.NMTOKEN; }
355 public override XmlTypeCode TypeCode
{
356 get { return XmlTypeCode.NmToken; }
360 public override Type ValueType
{
361 get { return typeof (string); }
364 public override object ParseValue (string s
,
365 XmlNameTable nameTable
, NSResolver nsmgr
)
367 if (!XmlChar
.IsNmToken (s
))
368 throw new ArgumentException ("'" + s
+ "' is an invalid NMTOKEN.");
372 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
374 return new StringValueType (ParseValue (s
, nameTable
, nsmgr
) as string);
379 internal class XsdNMTokens
: XsdNMToken
381 internal XsdNMTokens ()
385 public override XmlTokenizedType TokenizedType
{
386 get { return XmlTokenizedType.NMTOKENS; }
391 public override XmlTypeCode TypeCode
{
392 get { return XmlTypeCode.Item; }
396 public override Type ValueType
{
397 get { return typeof (string []); }
400 public override object ParseValue (string value, XmlNameTable nt
, NSResolver nsmgr
)
402 return GetValidatedArray (value, nt
);
405 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
407 return new StringArrayValueType (GetValidatedArray (s
, nameTable
));
410 private string [] GetValidatedArray (string value, XmlNameTable nt
)
412 string [] nmtokens
= ParseListValue (value, nt
);
413 for (int i
= 0; i
< nmtokens
.Length
; i
++)
414 if (!XmlChar
.IsNmToken (nmtokens
[i
]))
415 throw new ArgumentException ("Invalid name token.");
421 internal class XsdName
: XsdToken
427 public override XmlTokenizedType TokenizedType
{
428 get { return XmlTokenizedType.CDATA; }
432 public override XmlTypeCode TypeCode
{
433 get { return XmlTypeCode.Name; }
437 public override Type ValueType
{
438 get { return typeof (string); }
441 public override object ParseValue (string s
,
442 XmlNameTable nameTable
, NSResolver nsmgr
)
444 if (!XmlChar
.IsName (s
))
445 throw new ArgumentException ("'" + s
+ "' is an invalid name.");
449 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
451 return new StringValueType (ParseValue (s
, nameTable
, nsmgr
) as string);
456 internal class XsdNCName
: XsdName
458 internal XsdNCName ()
462 public override XmlTokenizedType TokenizedType
{
463 get { return XmlTokenizedType.NCName; }
467 public override XmlTypeCode TypeCode
{
468 get { return XmlTypeCode.NCName; }
472 public override Type ValueType
{
473 get { return typeof (string); }
476 public override object ParseValue (string s
,
477 XmlNameTable nameTable
, NSResolver nsmgr
)
479 if (!XmlChar
.IsNCName (s
))
480 throw new ArgumentException ("'" + s
+ "' is an invalid NCName.");
484 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
486 return new StringValueType (ParseValue (s
, nameTable
, nsmgr
) as string);
491 internal class XsdID
: XsdName
497 public override XmlTokenizedType TokenizedType
{
498 get { return XmlTokenizedType.ID; }
502 public override XmlTypeCode TypeCode
{
503 get { return XmlTypeCode.Id; }
507 public override Type ValueType
{
508 get { return typeof (string); }
511 public override object ParseValue (string s
, XmlNameTable nt
, NSResolver nsmgr
)
513 if (!XmlChar
.IsNCName (s
))
514 throw new ArgumentException ("'" + s
+ "' is an invalid NCName.");
520 internal class XsdIDRef
: XsdName
526 public override XmlTokenizedType TokenizedType
{
527 get { return XmlTokenizedType.IDREF; }
531 public override XmlTypeCode TypeCode
{
532 get { return XmlTypeCode.Idref; }
536 public override Type ValueType
{
537 get { return typeof (string); }
540 public override object ParseValue (string s
, XmlNameTable nt
, NSResolver nsmgr
)
542 if (!XmlChar
.IsNCName (s
))
543 throw new ArgumentException ("'" + s
+ "' is an invalid NCName.");
549 internal class XsdIDRefs
: XsdName
551 internal XsdIDRefs ()
555 public override XmlTokenizedType TokenizedType
{
556 get { return XmlTokenizedType.IDREFS; }
561 public override XmlTypeCode TypeCode
{
562 get { return XmlTypeCode.Item; }
566 public override Type ValueType
{
567 get { return typeof (string []); }
570 public override object ParseValue (string value, XmlNameTable nt
, NSResolver nsmgr
)
572 return GetValidatedArray (value, nt
);
575 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
577 return new StringArrayValueType (GetValidatedArray (s
, nameTable
));
580 private string [] GetValidatedArray (string value, XmlNameTable nt
)
582 string [] idrefs
= ParseListValue (value, nt
);
583 for (int i
= 0; i
< idrefs
.Length
; i
++)
584 XmlConvert
.VerifyNCName (idrefs
[i
]);
590 internal class XsdEntity
: XsdName
592 internal XsdEntity ()
596 public override XmlTokenizedType TokenizedType
{
597 get { return XmlTokenizedType.ENTITY; }
601 public override XmlTypeCode TypeCode
{
602 get { return XmlTypeCode.Entity; }
606 public override Type ValueType
{
607 get { return typeof (string); }
615 internal class XsdEntities
: XsdName
617 internal XsdEntities ()
621 public override XmlTokenizedType TokenizedType
{
622 get { return XmlTokenizedType.ENTITIES; }
627 public override XmlTypeCode TypeCode
{
628 get { return XmlTypeCode.Item; }
632 public override Type ValueType
{
633 get { return typeof (string []); }
636 public override object ParseValue (string value, XmlNameTable nt
, NSResolver nsmgr
)
638 return GetValidatedArray (value, nt
);
641 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
643 return new StringArrayValueType (GetValidatedArray (s
, nameTable
));
646 private string [] GetValidatedArray (string value, XmlNameTable nt
)
648 string [] entities
= ParseListValue (value, nt
);
649 for (int i
= 0; i
< entities
.Length
; i
++)
650 if (!XmlChar
.IsName (entities
[i
]))
651 throw new ArgumentException ("Invalid entitiy name.");
657 internal class XsdNotation
: XsdAnySimpleType
659 internal XsdNotation ()
663 internal override XmlSchemaFacet
.Facet AllowedFacets
{
664 get { return stringAllowedFacets; }
667 public override XmlTokenizedType TokenizedType
{
668 get { return XmlTokenizedType.NOTATION; }
672 public override XmlTypeCode TypeCode
{
673 get { return XmlTypeCode.Notation; }
677 public override Type ValueType
{
678 get { return typeof (string); }
681 public override object ParseValue (string s
,
682 XmlNameTable nameTable
, NSResolver nsmgr
)
684 return Normalize (s
);
687 // Fundamental Facets
688 public override bool Bounded
{
689 get { return false; }
691 public override bool Finite
{
692 get { return false; }
694 public override bool Numeric
{
695 get { return false; }
697 public override XsdOrderedFacet Ordered
{
698 get { return XsdOrderedFacet.False; }
704 internal class XsdDecimal
: XsdAnySimpleType
706 internal XsdDecimal ()
708 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
711 internal override XmlSchemaFacet
.Facet AllowedFacets
{
712 get { return decimalAllowedFacets; }
715 public override XmlTokenizedType TokenizedType
{
716 get { return XmlTokenizedType.None; }
720 public override XmlTypeCode TypeCode
{
721 get { return XmlTypeCode.Decimal; }
725 public override Type ValueType
{
726 get { return typeof (decimal); }
729 public override object ParseValue (string s
,
730 XmlNameTable nameTable
, NSResolver nsmgr
)
732 return ParseValueType (s
, nameTable
, nsmgr
);
735 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
737 return XmlConvert
.ToDecimal (this.Normalize (s
));
740 internal override XsdOrdering
Compare(object x
, object y
) {
741 if ((x
is Decimal
) && (y
is Decimal
)) {
742 int ret
= Decimal
.Compare((Decimal
)x
, (Decimal
)y
);
744 return XsdOrdering
.LessThan
;
747 return XsdOrdering
.GreaterThan
;
750 return XsdOrdering
.Equal
;
753 return XsdOrdering
.Indeterminate
;
756 // Fundamental Facets
757 public override bool Bounded
{
758 get { return false; }
760 public override bool Finite
{
761 get { return false; }
763 public override bool Numeric
{
766 public override XsdOrderedFacet Ordered
{
767 get { return XsdOrderedFacet.Total; }
773 internal class XsdInteger
: XsdDecimal
780 public override XmlTypeCode TypeCode
{
781 get { return XmlTypeCode.Integer; }
785 // Here it may be bigger than int's (or long's) MaxValue.
786 public override Type ValueType
{
787 get { return typeof (decimal); }
790 public override object ParseValue (string s
,
791 XmlNameTable nameTable
, NSResolver nsmgr
)
793 return ParseValueType (s
, nameTable
, nsmgr
);
796 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
798 decimal d
= XmlConvert
.ToDecimal (Normalize (s
));
799 if (Decimal
.Floor (d
) != d
)
800 throw new FormatException ("Integer contains point number.");
809 internal class XsdLong
: XsdInteger
812 public override XmlTypeCode TypeCode
{
813 get { return XmlTypeCode.Long; }
817 public override Type ValueType
{
818 get { return typeof (long); }
821 public override object ParseValue (string s
,
822 XmlNameTable nameTable
, NSResolver nsmgr
)
824 return ParseValueType (s
, nameTable
, nsmgr
);
827 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
829 return XmlConvert
.ToInt64 (Normalize (s
));
832 internal override XsdOrdering
Compare(object x
, object y
) {
833 if ((x
is long) && (y
is long)) {
834 if ((long)x
==(long)y
) {
835 return XsdOrdering
.Equal
;
837 else if ((long)x
<(long)y
) {
838 return XsdOrdering
.LessThan
;
841 return XsdOrdering
.GreaterThan
;
844 return XsdOrdering
.Indeterminate
;
849 internal class XsdInt
: XsdLong
852 public override XmlTypeCode TypeCode
{
853 get { return XmlTypeCode.Int; }
857 public override Type ValueType
{
858 get { return typeof (int); }
861 public override object ParseValue (string s
,
862 XmlNameTable nameTable
, NSResolver nsmgr
)
864 return ParseValueType (s
, nameTable
, nsmgr
);
867 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
869 return XmlConvert
.ToInt32 (Normalize (s
));
872 internal override XsdOrdering
Compare(object x
, object y
) {
873 if ((x
is int) && (y
is int)) {
874 if ((int)x
==(int)y
) {
875 return XsdOrdering
.Equal
;
877 else if ((int)x
<(int)y
) {
878 return XsdOrdering
.LessThan
;
881 return XsdOrdering
.GreaterThan
;
884 return XsdOrdering
.Indeterminate
;
890 internal class XsdShort
: XsdInt
893 public override XmlTypeCode TypeCode
{
894 get { return XmlTypeCode.Short; }
898 public override Type ValueType
{
899 get { return typeof (short); }
902 public override object ParseValue (string s
,
903 XmlNameTable nameTable
, NSResolver nsmgr
)
905 return ParseValueType (s
, nameTable
, nsmgr
);
908 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
910 return XmlConvert
.ToInt16 (Normalize (s
));
913 internal override XsdOrdering
Compare(object x
, object y
) {
914 if ((x
is short) && (y
is short)) {
915 if ((short)x
==(short)y
) {
916 return XsdOrdering
.Equal
;
918 else if ((short)x
<(short)y
) {
919 return XsdOrdering
.LessThan
;
922 return XsdOrdering
.GreaterThan
;
925 return XsdOrdering
.Indeterminate
;
930 internal class XsdByte
: XsdShort
933 public override XmlTypeCode TypeCode
{
934 get { return XmlTypeCode.Byte; }
938 public override Type ValueType
{
939 get { return typeof (sbyte); }
942 public override object ParseValue (string s
,
943 XmlNameTable nameTable
, NSResolver nsmgr
)
945 return ParseValueType (s
, nameTable
, nsmgr
);
948 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
950 return XmlConvert
.ToSByte (Normalize (s
));
953 internal override XsdOrdering
Compare(object x
, object y
) {
954 if ((x
is sbyte) && (y
is sbyte)) {
955 if ((sbyte)x
==(sbyte)y
) {
956 return XsdOrdering
.Equal
;
958 else if ((sbyte)x
<(sbyte)y
) {
959 return XsdOrdering
.LessThan
;
962 return XsdOrdering
.GreaterThan
;
965 return XsdOrdering
.Indeterminate
;
969 // xs:nonNegativeInteger
970 // [CLSCompliant (false)]
971 internal class XsdNonNegativeInteger
: XsdInteger
974 public override XmlTypeCode TypeCode
{
975 get { return XmlTypeCode.NonNegativeInteger; }
979 public override Type ValueType
{
980 get { return typeof (decimal); }
983 // [CLSCompliant (false)]
984 public override object ParseValue (string s
,
985 XmlNameTable nameTable
, NSResolver nsmgr
)
987 return ParseValueType (s
, nameTable
, nsmgr
);
990 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
992 return XmlConvert
.ToDecimal (Normalize (s
));
997 // [CLSCompliant (false)]
998 internal class XsdUnsignedLong
: XsdNonNegativeInteger
1001 public override XmlTypeCode TypeCode
{
1002 get { return XmlTypeCode.UnsignedLong; }
1006 public override Type ValueType
{
1007 get { return typeof (ulong); }
1010 public override object ParseValue (string s
,
1011 XmlNameTable nameTable
, NSResolver nsmgr
)
1013 return ParseValueType (s
, nameTable
, nsmgr
);
1016 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1018 return XmlConvert
.ToUInt64 (Normalize (s
));
1021 internal override XsdOrdering
Compare(object x
, object y
) {
1022 if ((x
is ulong) && (y
is ulong)) {
1023 if ((ulong)x
==(ulong)y
) {
1024 return XsdOrdering
.Equal
;
1026 else if ((ulong)x
<(ulong)y
) {
1027 return XsdOrdering
.LessThan
;
1030 return XsdOrdering
.GreaterThan
;
1033 return XsdOrdering
.Indeterminate
;
1038 // [CLSCompliant (false)]
1039 internal class XsdUnsignedInt
: XsdUnsignedLong
1042 public override XmlTypeCode TypeCode
{
1043 get { return XmlTypeCode.UnsignedInt; }
1047 public override Type ValueType
{
1048 get { return typeof (uint); }
1051 public override object ParseValue (string s
,
1052 XmlNameTable nameTable
, NSResolver nsmgr
)
1054 return ParseValueType (s
, nameTable
, nsmgr
);
1057 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1059 return XmlConvert
.ToUInt32 (Normalize (s
));
1062 internal override XsdOrdering
Compare(object x
, object y
) {
1063 if ((x
is uint) && (y
is uint)) {
1064 if ((uint)x
==(uint)y
) {
1065 return XsdOrdering
.Equal
;
1067 else if ((uint)x
<(uint)y
) {
1068 return XsdOrdering
.LessThan
;
1071 return XsdOrdering
.GreaterThan
;
1074 return XsdOrdering
.Indeterminate
;
1080 // [CLSCompliant (false)]
1081 internal class XsdUnsignedShort
: XsdUnsignedInt
1084 public override XmlTypeCode TypeCode
{
1085 get { return XmlTypeCode.UnsignedShort; }
1089 public override Type ValueType
{
1090 get { return typeof (ushort); }
1093 public override object ParseValue (string s
,
1094 XmlNameTable nameTable
, NSResolver nsmgr
)
1096 return ParseValueType (s
, nameTable
, nsmgr
);
1099 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1101 return XmlConvert
.ToUInt16 (Normalize (s
));
1104 internal override XsdOrdering
Compare(object x
, object y
) {
1105 if ((x
is ushort) && (y
is ushort)) {
1106 if ((ushort)x
==(ushort)y
) {
1107 return XsdOrdering
.Equal
;
1109 else if ((ushort)x
<(ushort)y
) {
1110 return XsdOrdering
.LessThan
;
1113 return XsdOrdering
.GreaterThan
;
1116 return XsdOrdering
.Indeterminate
;
1121 // [CLSCompliant (false)]
1122 internal class XsdUnsignedByte
: XsdUnsignedShort
1125 public override XmlTypeCode TypeCode
{
1126 get { return XmlTypeCode.UnsignedByte; }
1130 public override Type ValueType
{
1131 get { return typeof (byte); }
1134 public override object ParseValue (string s
,
1135 XmlNameTable nameTable
, NSResolver nsmgr
)
1137 return ParseValueType (s
, nameTable
, nsmgr
);
1140 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1142 return XmlConvert
.ToByte(Normalize (s
));
1145 internal override XsdOrdering
Compare(object x
, object y
) {
1146 if ((x
is byte) && (y
is byte)) {
1147 if ((byte)x
==(byte)y
) {
1148 return XsdOrdering
.Equal
;
1150 else if ((byte)x
<(byte)y
) {
1151 return XsdOrdering
.LessThan
;
1154 return XsdOrdering
.GreaterThan
;
1157 return XsdOrdering
.Indeterminate
;
1162 // xs:positiveInteger
1163 // [CLSCompliant (false)]
1164 internal class XsdPositiveInteger
: XsdNonNegativeInteger
1167 public override XmlTypeCode TypeCode
{
1168 get { return XmlTypeCode.PositiveInteger; }
1172 // It returns decimal, instead of int or long.
1173 // Maybe MS developers thought about big integer...
1174 public override Type ValueType
{
1175 get { return typeof (decimal); }
1178 public override object ParseValue (string s
,
1179 XmlNameTable nameTable
, NSResolver nsmgr
)
1181 return ParseValueType (s
, nameTable
, nsmgr
);
1184 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1186 return XmlConvert
.ToDecimal (Normalize (s
));
1190 // xs:nonPositiveInteger
1191 internal class XsdNonPositiveInteger
: XsdInteger
1194 public override XmlTypeCode TypeCode
{
1195 get { return XmlTypeCode.NonPositiveInteger; }
1199 public override Type ValueType
{
1200 get { return typeof (decimal); }
1203 public override object ParseValue (string s
,
1204 XmlNameTable nameTable
, NSResolver nsmgr
)
1206 return ParseValueType (s
, nameTable
, nsmgr
);
1209 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1211 return XmlConvert
.ToDecimal (Normalize (s
));
1215 // xs:negativeInteger
1216 internal class XsdNegativeInteger
: XsdNonPositiveInteger
1219 public override XmlTypeCode TypeCode
{
1220 get { return XmlTypeCode.NegativeInteger; }
1224 public override Type ValueType
{
1226 get { return typeof (decimal); }
1229 public override object ParseValue (string s
,
1230 XmlNameTable nameTable
, NSResolver nsmgr
)
1232 return ParseValueType (s
, nameTable
, nsmgr
);
1235 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1237 return XmlConvert
.ToDecimal (Normalize (s
));
1242 internal class XsdFloat
: XsdAnySimpleType
1245 public override XmlTypeCode TypeCode
{
1246 get { return XmlTypeCode.Float; }
1250 internal XsdFloat ()
1252 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
1255 internal override XmlSchemaFacet
.Facet AllowedFacets
{
1256 get { return durationAllowedFacets; }
1259 // Fundamental Facets
1260 public override bool Bounded
{
1261 get { return true; }
1263 public override bool Finite
{
1264 get { return true; }
1266 public override bool Numeric
{
1267 get { return true; }
1269 public override XsdOrderedFacet Ordered
{
1270 get { return XsdOrderedFacet.Total; }
1273 public override Type ValueType
{
1274 get { return typeof (float); }
1277 public override object ParseValue (string s
,
1278 XmlNameTable nameTable
, NSResolver nsmgr
)
1280 return ParseValueType (s
, nameTable
, nsmgr
);
1283 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1285 return XmlConvert
.ToSingle (Normalize (s
));
1288 internal override XsdOrdering
Compare(object x
, object y
) {
1289 if ((x
is float) && (y
is float)) {
1290 if ((float)x
==(float)y
) {
1291 return XsdOrdering
.Equal
;
1293 else if ((float)x
<(float)y
) {
1294 return XsdOrdering
.LessThan
;
1297 return XsdOrdering
.GreaterThan
;
1300 return XsdOrdering
.Indeterminate
;
1306 internal class XsdDouble
: XsdAnySimpleType
1308 internal XsdDouble ()
1310 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
1313 internal override XmlSchemaFacet
.Facet AllowedFacets
{
1314 get { return durationAllowedFacets; }
1317 // Fundamental Facets
1318 public override bool Bounded
{
1319 get { return true; }
1321 public override bool Finite
{
1322 get { return true; }
1324 public override bool Numeric
{
1325 get { return true; }
1327 public override XsdOrderedFacet Ordered
{
1328 get { return XsdOrderedFacet.Total; }
1332 public override XmlTypeCode TypeCode
{
1333 get { return XmlTypeCode.Double; }
1337 public override Type ValueType
{
1338 get { return typeof (double); }
1341 public override object ParseValue (string s
,
1342 XmlNameTable nameTable
, NSResolver nsmgr
)
1344 return ParseValueType (s
, nameTable
, nsmgr
);
1347 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1349 return XmlConvert
.ToDouble (Normalize (s
));
1352 internal override XsdOrdering
Compare(object x
, object y
) {
1353 if ((x
is double) && (y
is double)) {
1354 if ((double)x
==(double)y
) {
1355 return XsdOrdering
.Equal
;
1357 else if ((double)x
<(double)y
) {
1358 return XsdOrdering
.LessThan
;
1361 return XsdOrdering
.GreaterThan
;
1364 return XsdOrdering
.Indeterminate
;
1370 internal class XsdBase64Binary
: XsdString
1372 internal XsdBase64Binary ()
1377 public override XmlTypeCode TypeCode
{
1378 get { return XmlTypeCode.Base64Binary; }
1382 public override Type ValueType
{
1383 get { return typeof (byte[]); }
1386 public override object ParseValue (string s
,
1387 XmlNameTable nameTable
, NSResolver nsmgr
)
1389 // If it isnt ASCII it isnt valid base64 data
1390 byte[] inArr
= new System
.Text
.ASCIIEncoding().GetBytes(s
);
1391 FromBase64Transform t
= new FromBase64Transform();
1392 return t
.TransformFinalBlock(inArr
, 0, inArr
.Length
);
1396 internal override int Length(string s
) {
1400 for (int i
= 0; i
< end
; i
++) {
1402 if (!Char
.IsWhiteSpace(c
)) {
1408 return -1; // Invalid characters
1412 return -1; // Max 2 padding at the end.
1416 return ((length
/4)*3)+pad
;
1419 /* TODO: Use the Base64Table and similar code when it makes it
1420 * out of System.Security.Cryptography (currently internal so I
1421 * don't think we can use it).
1424 private static string ALPHABET
=
1425 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1427 private static byte[] decodeTable
;
1428 static XsdBase64Binary ()
1430 int len
= ALPHABET
.Length
;
1432 decodeTable
= new byte [1 + (int)'z'];
1434 for (int i
=0; i
< decodeTable
.Length
; i
++) {
1435 decodeTable
[i
] = Byte
.MaxValue
;
1438 for (int i
=0; i
< len
; i
++) {
1439 char ch
= ALPHABET
[i
];
1440 decodeTable
[(int)ch
] = (byte) i
;
1444 protected static bool isPad(char octect
) {
1445 return (octect
== '=');
1448 protected static bool isData(char octect
) {
1449 return ((octect
<= 'z') && (decodeTable
[octect
] != Byte
.MaxValue
));
1453 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1455 return new StringValueType (ParseValue (s
, nameTable
, nsmgr
) as string);
1461 internal class XsdHexBinary
: XsdAnySimpleType
1463 internal XsdHexBinary ()
1465 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
1468 internal override XmlSchemaFacet
.Facet AllowedFacets
{
1469 get { return stringAllowedFacets; }
1473 public override XmlTypeCode TypeCode
{
1474 get { return XmlTypeCode.HexBinary; }
1478 public override XmlTokenizedType TokenizedType
{
1479 get { return XmlTokenizedType.None; }
1482 public override Type ValueType
{
1483 get { return typeof (byte []); }
1486 public override object ParseValue (string s
,
1487 XmlNameTable nameTable
, NSResolver nsmgr
)
1489 return XmlConvert
.FromBinHexString (Normalize (s
));
1492 internal override int Length(string s
) {
1493 return s
.Length
/ 2 + s
.Length
% 2 ; // Not sure if odd lengths are even allowed
1496 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1498 return new StringValueType (ParseValue (s
, nameTable
, nsmgr
) as string);
1501 // Fundamental Facets ... no need to override
1505 internal class XsdQName
: XsdName
1507 internal XsdQName ()
1511 // Fundamental facets are the same as anySimpleType.
1513 public override XmlTokenizedType TokenizedType
{
1514 get { return XmlTokenizedType.QName; }
1518 public override XmlTypeCode TypeCode
{
1519 get { return XmlTypeCode.QName; }
1523 public override Type ValueType
{
1524 get { return typeof (XmlQualifiedName); }
1527 // ParseValue () method is as same as that of xs:string
1528 public override object ParseValue (string s
,
1529 XmlNameTable nameTable
, NSResolver nsmgr
)
1531 if (nameTable
== null)
1532 throw new ArgumentNullException ("name table");
1534 throw new ArgumentNullException ("namespace manager");
1535 XmlQualifiedName name
= XmlQualifiedName
.Parse (s
, nsmgr
, true);
1536 nameTable
.Add (name
.Name
);
1537 nameTable
.Add (name
.Namespace
);
1541 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1543 return new QNameValueType (ParseValue (s
, nameTable
, nsmgr
) as XmlQualifiedName
);
1548 internal class XsdBoolean
: XsdAnySimpleType
1550 internal XsdBoolean ()
1552 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
1555 internal override XmlSchemaFacet
.Facet AllowedFacets
{
1556 get { return booleanAllowedFacets; }
1559 public override XmlTokenizedType TokenizedType
{
1561 if (XmlSchemaUtil
.StrictMsCompliant
)
1562 return XmlTokenizedType
.None
;
1564 return XmlTokenizedType
.CDATA
;
1569 public override XmlTypeCode TypeCode
{
1570 get { return XmlTypeCode.Boolean; }
1574 public override Type ValueType
{
1575 get { return typeof (bool); }
1578 public override object ParseValue (string s
,
1579 XmlNameTable nameTable
, NSResolver nsmgr
)
1581 return ParseValueType (s
, nameTable
, nsmgr
);
1584 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1586 return XmlConvert
.ToBoolean (this.Normalize (s
));
1589 // Fundamental Facets
1590 public override bool Bounded
{
1591 get { return false; }
1593 public override bool Finite
{
1594 get { return true; }
1596 public override bool Numeric
{
1597 get { return false; }
1599 public override XsdOrderedFacet Ordered
{
1600 get { return XsdOrderedFacet.Total; }
1607 internal class XsdAnyURI
: XsdString
1609 public override XmlTokenizedType TokenizedType
{
1611 get { return XmlTokenizedType.CDATA; }
1615 public override XmlTypeCode TypeCode
{
1616 get { return XmlTypeCode.AnyUri; }
1620 public override Type ValueType
{
1621 get { return typeof (Uri); }
1624 public override object ParseValue (string s
,
1625 XmlNameTable nameTable
, NSResolver nsmgr
)
1627 return new XmlSchemaUri (Normalize (s
));
1630 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1632 return new UriValueType ((XmlSchemaUri
) ParseValue (s
, nameTable
, nsmgr
));
1636 internal class XmlSchemaUri
: Uri
1638 public string value;
1640 static bool HasValidScheme (string src
)
1642 int idx
= src
.IndexOf (':');
1645 for (int i
= 0; i
< idx
; i
++) {
1652 if (Char
.IsLetterOrDigit (src
[i
]))
1660 // MS BUG: Some strings that contain ':' might result in
1661 // exception (MS.NET looks implemented as such).
1662 public XmlSchemaUri (string src
)
1663 : this (src
, HasValidScheme (src
))
1667 private XmlSchemaUri (string src
, bool formal
)
1668 : base (formal
? src
: "anyuri:" + src
, !formal
)
1673 public static bool operator == (XmlSchemaUri v1
, XmlSchemaUri v2
)
1675 return v1
.value == v2
.value;
1678 public static bool operator != (XmlSchemaUri v1
, XmlSchemaUri v2
)
1680 return v1
.value != v2
.value;
1683 public override bool Equals (object obj
)
1685 if (obj
is XmlSchemaUri
)
1686 return (XmlSchemaUri
) obj
== this;
1691 public override int GetHashCode ()
1693 return value.GetHashCode ();
1696 public override string ToString ()
1703 internal class XsdDuration
: XsdAnySimpleType
1705 internal XsdDuration ()
1707 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
1710 internal override XmlSchemaFacet
.Facet AllowedFacets
{
1711 get { return durationAllowedFacets; }
1714 public override XmlTokenizedType TokenizedType
{
1715 get { return XmlTokenizedType.CDATA; }
1719 public override XmlTypeCode TypeCode
{
1720 get { return XmlTypeCode.Duration; }
1724 public override Type ValueType
{
1725 get { return typeof (TimeSpan); }
1728 public override object ParseValue (string s
,
1729 XmlNameTable nameTable
, NSResolver nsmgr
)
1731 return ParseValueType (s
, nameTable
, nsmgr
);
1734 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1736 return XmlConvert
.ToTimeSpan (Normalize (s
));
1739 internal override XsdOrdering
Compare(object x
, object y
) {
1740 /* FIXME: This is really simple so far
1742 * In fact in order to do this correctly in XmlSchema, we cannot use TimeSpan as the base type
1743 * Though it turns out that MS .NET is a little broken in this regard too. Not doing comparisons
1746 if ((x
is TimeSpan
) && (y
is TimeSpan
)) {
1747 int ret
= TimeSpan
.Compare((TimeSpan
)x
, (TimeSpan
)y
);
1749 return XsdOrdering
.LessThan
;
1752 return XsdOrdering
.GreaterThan
;
1755 return XsdOrdering
.Equal
;
1758 return XsdOrdering
.Indeterminate
;
1762 // Fundamental Facets
1763 public override bool Bounded
{
1764 get { return false; }
1766 public override bool Finite
{
1767 get { return false; }
1769 public override bool Numeric
{
1770 get { return false; }
1772 public override XsdOrderedFacet Ordered
{
1773 get { return XsdOrderedFacet.Partial; }
1779 // xdt:dayTimeDuration
1780 internal class XdtDayTimeDuration
: XsdDuration
1782 internal XdtDayTimeDuration ()
1786 public override XmlTypeCode TypeCode
{
1787 get { return XmlTypeCode.DayTimeDuration; }
1790 public override Type ValueType
{
1791 get { return typeof (TimeSpan); }
1794 public override object ParseValue (string s
,
1795 XmlNameTable nameTable
, NSResolver nsmgr
)
1797 return ParseValueType (s
, nameTable
, nsmgr
);
1800 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1802 return XmlConvert
.ToTimeSpan (Normalize (s
));
1805 // FIXME: Fundamental Facets
1806 public override bool Bounded
{
1807 get { return false; }
1809 public override bool Finite
{
1810 get { return false; }
1812 public override bool Numeric
{
1813 get { return false; }
1815 public override XsdOrderedFacet Ordered
{
1816 get { return XsdOrderedFacet.Partial; }
1821 // xdt:yearMonthDuration
1822 internal class XdtYearMonthDuration
: XsdDuration
1824 internal XdtYearMonthDuration ()
1828 public override XmlTypeCode TypeCode
{
1829 get { return XmlTypeCode.YearMonthDuration; }
1832 public override Type ValueType
{
1833 get { return typeof (TimeSpan); }
1836 public override object ParseValue (string s
,
1837 XmlNameTable nameTable
, NSResolver nsmgr
)
1839 return ParseValueType (s
, nameTable
, nsmgr
);
1842 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1844 return XmlConvert
.ToTimeSpan (Normalize (s
));
1847 // FIXME: Fundamental Facets
1848 public override bool Bounded
{
1849 get { return false; }
1851 public override bool Finite
{
1852 get { return false; }
1854 public override bool Numeric
{
1855 get { return false; }
1857 public override XsdOrderedFacet Ordered
{
1858 get { return XsdOrderedFacet.Partial; }
1865 internal class XsdDateTime
: XsdAnySimpleType
1867 internal XsdDateTime ()
1869 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
1872 internal override XmlSchemaFacet
.Facet AllowedFacets
{
1873 get { return durationAllowedFacets; }
1876 public override XmlTokenizedType TokenizedType
{
1877 get { return XmlTokenizedType.CDATA; }
1881 public override XmlTypeCode TypeCode
{
1882 get { return XmlTypeCode.DateTime; }
1886 public override Type ValueType
{
1887 get { return typeof (DateTime); }
1890 public override object ParseValue (string s
,
1891 XmlNameTable nameTable
, NSResolver nsmgr
)
1893 return ParseValueType (s
, nameTable
, nsmgr
);
1896 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1898 return XmlConvert
.ToDateTime (Normalize (s
));
1901 internal override XsdOrdering
Compare(object x
, object y
) {
1902 /* Really simple so far */
1903 if ((x
is DateTime
) && (y
is DateTime
)) {
1904 int ret
= DateTime
.Compare((DateTime
)x
, (DateTime
)y
);
1906 return XsdOrdering
.LessThan
;
1909 return XsdOrdering
.GreaterThan
;
1912 return XsdOrdering
.Equal
;
1915 return XsdOrdering
.Indeterminate
;
1918 // Fundamental Facets
1919 public override bool Bounded
{
1920 get { return false; }
1922 public override bool Finite
{
1923 get { return false; }
1925 public override bool Numeric
{
1926 get { return false; }
1928 public override XsdOrderedFacet Ordered
{
1929 get { return XsdOrderedFacet.Partial; }
1935 internal class XsdDate
: XsdAnySimpleType
1939 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
1942 internal override XmlSchemaFacet
.Facet AllowedFacets
{
1943 get { return durationAllowedFacets; }
1946 public override XmlTokenizedType TokenizedType
{
1947 get { return XmlTokenizedType.CDATA; }
1951 public override XmlTypeCode TypeCode
{
1952 get { return XmlTypeCode.Date; }
1956 public override Type ValueType
{
1957 get { return typeof (DateTime); }
1960 public override object ParseValue (string s
,
1961 XmlNameTable nameTable
, NSResolver nsmgr
)
1963 return ParseValueType (s
, nameTable
, nsmgr
);
1966 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
1968 return DateTime
.ParseExact (Normalize (s
), "yyyy-MM-dd", null);
1971 internal override XsdOrdering
Compare(object x
, object y
) {
1972 /* Really simple so far */
1973 if ((x
is DateTime
) && (y
is DateTime
)) {
1974 int ret
= DateTime
.Compare((DateTime
)x
, (DateTime
)y
);
1976 return XsdOrdering
.LessThan
;
1979 return XsdOrdering
.GreaterThan
;
1982 return XsdOrdering
.Equal
;
1985 return XsdOrdering
.Indeterminate
;
1987 // Fundamental Facets ... no need to override except for Ordered.
1988 public override XsdOrderedFacet Ordered
{
1989 get { return XsdOrderedFacet.Partial; }
1995 internal class XsdTime
: XsdAnySimpleType
1997 static string [] timeFormats
= new string [] {
1998 // copied from XmlConvert.
2012 "HH:mm:ss.fffffzzz",
2013 "HH:mm:ss.ffffffzzz",
2014 "HH:mm:ss.fffffffzzz",
2022 "HH:mm:ss.fffffffZ"};
2026 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
2029 internal override XmlSchemaFacet
.Facet AllowedFacets
{
2030 get { return durationAllowedFacets; }
2033 public override XmlTokenizedType TokenizedType
{
2034 get { return XmlTokenizedType.CDATA; }
2038 public override XmlTypeCode TypeCode
{
2039 get { return XmlTypeCode.Time; }
2043 public override Type ValueType
{
2044 get { return typeof (DateTime); }
2047 public override object ParseValue (string s
,
2048 XmlNameTable nameTable
, NSResolver nsmgr
)
2050 return ParseValueType (s
, nameTable
, nsmgr
);
2053 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
2055 return DateTime
.ParseExact (Normalize (s
), timeFormats
, null, DateTimeStyles
.None
);
2058 internal override XsdOrdering
Compare(object x
, object y
) {
2059 /* Really simple so far */
2060 if ((x
is DateTime
) && (y
is DateTime
)) {
2061 int ret
= DateTime
.Compare((DateTime
)x
, (DateTime
)y
);
2063 return XsdOrdering
.LessThan
;
2066 return XsdOrdering
.GreaterThan
;
2069 return XsdOrdering
.Equal
;
2072 return XsdOrdering
.Indeterminate
;
2074 // Fundamental Facets ... no need to override except for Ordered.
2075 public override XsdOrderedFacet Ordered
{
2076 get { return XsdOrderedFacet.Partial; }
2082 internal class XsdGYearMonth
: XsdAnySimpleType
2084 internal XsdGYearMonth ()
2086 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
2089 internal override XmlSchemaFacet
.Facet AllowedFacets
{
2090 get { return durationAllowedFacets; }
2094 public override XmlTypeCode TypeCode
{
2095 get { return XmlTypeCode.GYearMonth; }
2099 public override Type ValueType
{
2100 get { return typeof (DateTime); }
2103 public override object ParseValue (string s
,
2104 XmlNameTable nameTable
, NSResolver nsmgr
)
2106 return ParseValueType (s
, nameTable
, nsmgr
);
2109 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
2111 return DateTime
.ParseExact (Normalize (s
), "yyyy-MM", null);
2114 internal override XsdOrdering
Compare(object x
, object y
) {
2115 /* Really simple so far */
2116 if ((x
is DateTime
) && (y
is DateTime
)) {
2117 int ret
= DateTime
.Compare((DateTime
)x
, (DateTime
)y
);
2119 return XsdOrdering
.LessThan
;
2122 return XsdOrdering
.GreaterThan
;
2125 return XsdOrdering
.Equal
;
2128 return XsdOrdering
.Indeterminate
;
2133 internal class XsdGMonthDay
: XsdAnySimpleType
2135 internal XsdGMonthDay ()
2137 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
2140 internal override XmlSchemaFacet
.Facet AllowedFacets
{
2141 get { return durationAllowedFacets; }
2145 public override XmlTypeCode TypeCode
{
2146 get { return XmlTypeCode.GMonthDay; }
2150 public override Type ValueType
{
2151 get { return typeof (DateTime); }
2154 public override object ParseValue (string s
,
2155 XmlNameTable nameTable
, NSResolver nsmgr
)
2157 return ParseValueType (s
, nameTable
, nsmgr
);
2160 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
2162 return DateTime
.ParseExact (Normalize (s
), "--MM-dd", null);
2165 internal override XsdOrdering
Compare(object x
, object y
) {
2166 /* Really simple so far */
2167 if ((x
is DateTime
) && (y
is DateTime
)) {
2168 int ret
= DateTime
.Compare((DateTime
)x
, (DateTime
)y
);
2170 return XsdOrdering
.LessThan
;
2173 return XsdOrdering
.GreaterThan
;
2176 return XsdOrdering
.Equal
;
2179 return XsdOrdering
.Indeterminate
;
2184 internal class XsdGYear
: XsdAnySimpleType
2186 internal XsdGYear ()
2188 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
2191 internal override XmlSchemaFacet
.Facet AllowedFacets
{
2192 get { return durationAllowedFacets; }
2196 public override XmlTypeCode TypeCode
{
2197 get { return XmlTypeCode.GYear; }
2201 public override Type ValueType
{
2202 get { return typeof (DateTime); }
2205 // LAMESPEC: XML Schema Datatypes allows leading '-' to identify B.C. years,
2206 // but CLR DateTime does not allow such expression.
2207 public override object ParseValue (string s
,
2208 XmlNameTable nameTable
, NSResolver nsmgr
)
2210 return ParseValueType (s
, nameTable
, nsmgr
);
2213 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
2215 return DateTime
.ParseExact (Normalize(s
), "yyyy", null);
2218 internal override XsdOrdering
Compare(object x
, object y
) {
2219 /* Really simple so far */
2220 if ((x
is DateTime
) && (y
is DateTime
)) {
2221 int ret
= DateTime
.Compare((DateTime
)x
, (DateTime
)y
);
2223 return XsdOrdering
.LessThan
;
2226 return XsdOrdering
.GreaterThan
;
2229 return XsdOrdering
.Equal
;
2232 return XsdOrdering
.Indeterminate
;
2237 internal class XsdGMonth
: XsdAnySimpleType
2239 internal XsdGMonth ()
2241 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
2244 internal override XmlSchemaFacet
.Facet AllowedFacets
{
2245 get { return durationAllowedFacets; }
2249 public override XmlTypeCode TypeCode
{
2250 get { return XmlTypeCode.GMonth; }
2254 public override Type ValueType
{
2255 get { return typeof (DateTime); }
2258 public override object ParseValue (string s
,
2259 XmlNameTable nameTable
, NSResolver nsmgr
)
2261 return ParseValueType (s
, nameTable
, nsmgr
);
2264 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
2266 return DateTime
.ParseExact (Normalize(s
), "--MM--", null);
2269 internal override XsdOrdering
Compare(object x
, object y
) {
2270 /* Really simple so far */
2271 if ((x
is DateTime
) && (y
is DateTime
)) {
2272 int ret
= DateTime
.Compare((DateTime
)x
, (DateTime
)y
);
2274 return XsdOrdering
.LessThan
;
2277 return XsdOrdering
.GreaterThan
;
2280 return XsdOrdering
.Equal
;
2283 return XsdOrdering
.Indeterminate
;
2288 internal class XsdGDay
: XsdAnySimpleType
2292 this.WhitespaceValue
= XsdWhitespaceFacet
.Collapse
;
2295 internal override XmlSchemaFacet
.Facet AllowedFacets
{
2296 get { return durationAllowedFacets; }
2300 public override XmlTypeCode TypeCode
{
2301 get { return XmlTypeCode.GDay; }
2305 public override Type ValueType
{
2306 get { return typeof (DateTime); }
2309 public override object ParseValue (string s
,
2310 XmlNameTable nameTable
, NSResolver nsmgr
)
2312 return ParseValueType (s
, nameTable
, nsmgr
);
2315 internal override ValueType
ParseValueType (string s
, XmlNameTable nameTable
, NSResolver nsmgr
)
2317 return DateTime
.ParseExact (Normalize(s
), "---dd", null);
2320 internal override XsdOrdering
Compare(object x
, object y
) {
2321 /* Really simple so far */
2322 if ((x
is DateTime
) && (y
is DateTime
)) {
2323 int ret
= DateTime
.Compare((DateTime
)x
, (DateTime
)y
);
2325 return XsdOrdering
.LessThan
;
2328 return XsdOrdering
.GreaterThan
;
2331 return XsdOrdering
.Equal
;
2334 return XsdOrdering
.Indeterminate
;