2 // System.Xml.Schema.XmlSchemaDatatype.cs
\r
7 // (C)2003 Atsushi Enomoto
\r
10 using System.Collections;
\r
13 using System.Xml.Schema;
\r
14 using System.Globalization;
\r
16 namespace Mono.Xml.Schema
\r
18 public enum XsdWhitespaceFacet
\r
25 public enum XsdOrderedFacet
\r
32 public class XsdAnySimpleType : XmlSchemaDatatype
\r
34 static XsdAnySimpleType instance;
\r
35 static XsdAnySimpleType ()
\r
37 instance = new XsdAnySimpleType ();
\r
40 public static XsdAnySimpleType Instance {
\r
41 get { return instance; }
\r
44 readonly char [] whitespaceArray = new char [] {' '};
\r
46 // Fundamental Facets
\r
47 public virtual bool Bounded {
\r
48 get { return false; }
\r
51 public virtual bool Finite {
\r
52 get { return false; }
\r
55 public virtual bool Numeric {
\r
56 get { return false; }
\r
59 public virtual XsdOrderedFacet Ordered {
\r
60 get { return XsdOrderedFacet.False; }
\r
63 public override Type ValueType {
\r
64 get { return typeof (object); }
\r
67 public override XmlTokenizedType TokenizedType {
\r
69 return XmlTokenizedType.None;
\r
73 public override object ParseValue (string s,
\r
74 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
76 return Normalize (s);
\r
79 internal string [] ParseListValue (string s, XmlNameTable nameTable)
\r
81 return this.Normalize (s, XsdWhitespaceFacet.Collapse).Split (whitespaceArray);
\r
86 public class XsdString : XsdAnySimpleType
\r
88 internal XsdString ()
\r
92 public override XmlTokenizedType TokenizedType {
\r
93 get { return XmlTokenizedType.CDATA; }
\r
96 public override Type ValueType {
\r
97 get { return typeof (string); }
\r
100 // Fundamental Facets
\r
101 public override bool Bounded {
\r
102 get { return false; }
\r
104 public override bool Finite {
\r
105 get { return false; }
\r
107 public override bool Numeric {
\r
108 get { return false; }
\r
110 public override XsdOrderedFacet Ordered {
\r
111 get { return XsdOrderedFacet.False; }
\r
114 /* Freeze their use now.
\r
115 // Constraining Facets
\r
116 public bool HasLengthFacet;
\r
117 public bool HasMaxLengthFacet;
\r
118 public bool HasMinLengthFacet;
\r
120 public int MaxLength;
\r
121 public int MinLength;
\r
122 public string Pattern;
\r
123 public ICollection Enumeration;
\r
127 // xs:normalizedString
\r
128 public class XsdNormalizedString : XsdString
\r
130 internal XsdNormalizedString ()
\r
132 this.WhitespaceValue = XsdWhitespaceFacet.Replace;
\r
135 public override XmlTokenizedType TokenizedType {
\r
137 get { return XmlTokenizedType.CDATA; }
\r
140 public override Type ValueType {
\r
141 get { return typeof (string); }
\r
144 // ParseValue () method is as same as that of xs:string
\r
148 public class XsdToken : XsdNormalizedString
\r
150 internal XsdToken ()
\r
152 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
\r
155 public override XmlTokenizedType TokenizedType {
\r
156 get { return XmlTokenizedType.CDATA; }
\r
159 public override Type ValueType {
\r
160 get { return typeof (string); }
\r
163 // ParseValue () method is as same as that of xs:string
\r
167 public class XsdLanguage : XsdToken
\r
169 internal XsdLanguage ()
\r
173 public override XmlTokenizedType TokenizedType {
\r
174 get { return XmlTokenizedType.CDATA; }
\r
177 public override Type ValueType {
\r
178 get { return typeof (string); }
\r
181 // ParseValue () method is as same as that of xs:string
\r
185 public class XsdNMToken : XsdToken
\r
187 internal XsdNMToken ()
\r
191 public override XmlTokenizedType TokenizedType {
\r
192 get { return XmlTokenizedType.NMTOKEN; }
\r
195 public override Type ValueType {
\r
196 get { return typeof (string); }
\r
199 public override object ParseValue (string s,
\r
200 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
202 if (!XmlChar.IsNmToken (s))
\r
203 throw new ArgumentException ("'" + s + "' is an invalid NMTOKEN.");
\r
210 public class XsdNMTokens : XsdNMToken
\r
212 internal XsdNMTokens ()
\r
216 public override XmlTokenizedType TokenizedType {
\r
217 get { return XmlTokenizedType.NMTOKENS; }
\r
220 public override Type ValueType {
\r
221 get { return typeof (string []); }
\r
224 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
226 return ParseListValue (value, nt);
\r
231 public class XsdName : XsdToken
\r
233 internal XsdName ()
\r
237 public override XmlTokenizedType TokenizedType {
\r
238 get { return XmlTokenizedType.CDATA; }
\r
241 public override Type ValueType {
\r
242 get { return typeof (string); }
\r
245 public override object ParseValue (string s,
\r
246 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
248 if (!XmlChar.IsName (s))
\r
249 throw new ArgumentException ("'" + s + "' is an invalid name.");
\r
255 public class XsdNCName : XsdName
\r
257 internal XsdNCName ()
\r
261 public override XmlTokenizedType TokenizedType {
\r
262 get { return XmlTokenizedType.NCName; }
\r
265 public override Type ValueType {
\r
266 get { return typeof (string); }
\r
269 public override object ParseValue (string s,
\r
270 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
272 if (!XmlChar.IsNCName (s))
\r
273 throw new ArgumentException ("'" + s + "' is an invalid NCName.");
\r
280 public class XsdID : XsdName
\r
286 public override XmlTokenizedType TokenizedType {
\r
287 get { return XmlTokenizedType.ID; }
\r
290 public override Type ValueType {
\r
291 get { return typeof (string); }
\r
294 // ParseValue () method is as same as that of xs:string
\r
298 public class XsdIDRef : XsdName
\r
300 internal XsdIDRef ()
\r
304 public override XmlTokenizedType TokenizedType {
\r
305 get { return XmlTokenizedType.IDREF; }
\r
308 public override Type ValueType {
\r
309 get { return typeof (string); }
\r
312 // ParseValue () method is as same as that of xs:string
\r
316 public class XsdIDRefs : XsdName
\r
318 internal XsdIDRefs ()
\r
322 public override XmlTokenizedType TokenizedType {
\r
323 get { return XmlTokenizedType.IDREFS; }
\r
326 public override Type ValueType {
\r
327 get { return typeof (string []); }
\r
330 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
332 return ParseListValue (value, nt);
\r
337 public class XsdEntity : XsdName
\r
339 internal XsdEntity ()
\r
344 public override XmlTokenizedType TokenizedType {
\r
345 get { return XmlTokenizedType.ENTITY; }
\r
348 public override Type ValueType {
\r
349 get { return typeof (string); }
\r
352 // ParseValue () method is as same as that of xs:string
\r
357 public class XsdEntities : XsdName
\r
359 internal XsdEntities ()
\r
363 public override XmlTokenizedType TokenizedType {
\r
364 get { return XmlTokenizedType.ENTITIES; }
\r
367 public override Type ValueType {
\r
368 get { return typeof (string []); }
\r
371 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
373 return ParseListValue (value, nt);
\r
378 public class XsdNotation : XsdAnySimpleType
\r
380 internal XsdNotation ()
\r
384 public override XmlTokenizedType TokenizedType {
\r
385 get { return XmlTokenizedType.NOTATION; }
\r
388 public override Type ValueType {
\r
389 get { return typeof (string); }
\r
392 public override object ParseValue (string s,
\r
393 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
395 return Normalize (s);
\r
398 // Fundamental Facets
\r
399 public override bool Bounded {
\r
400 get { return false; }
\r
402 public override bool Finite {
\r
403 get { return false; }
\r
405 public override bool Numeric {
\r
406 get { return false; }
\r
408 public override XsdOrderedFacet Ordered {
\r
409 get { return XsdOrderedFacet.False; }
\r
412 // Constraining Facets
\r
413 public bool HasLengthFacet;
\r
414 public bool HasMaxLengthFacet;
\r
415 public bool HasMinLengthFacet;
\r
417 public int MaxLength;
\r
418 public int MinLength;
\r
419 public string Pattern;
\r
420 public ICollection Enumeration;
\r
424 public class XsdDecimal : XsdAnySimpleType
\r
426 internal XsdDecimal ()
\r
430 public override XmlTokenizedType TokenizedType {
\r
431 get { return XmlTokenizedType.None; }
\r
434 public override Type ValueType {
\r
435 get { return typeof (decimal); }
\r
438 public override object ParseValue (string s,
\r
439 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
441 return XmlConvert.ToDecimal (this.Normalize (s));
\r
444 // Fundamental Facets
\r
445 public override bool Bounded {
\r
446 get { return false; }
\r
448 public override bool Finite {
\r
449 get { return false; }
\r
451 public override bool Numeric {
\r
452 get { return true; }
\r
454 public override XsdOrderedFacet Ordered {
\r
455 get { return XsdOrderedFacet.Total; }
\r
458 // Constraining Facets
\r
459 public bool HasLengthFacet;
\r
460 public bool HasMaxLengthFacet;
\r
461 public bool HasMinLengthFacet;
\r
463 public int MaxLength;
\r
464 public int MinLength;
\r
465 public string Pattern;
\r
466 public ICollection Enumeration;
\r
470 public class XsdInteger : XsdDecimal
\r
472 public XsdInteger ()
\r
474 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
\r
477 // Here it may be bigger than int's (or long's) MaxValue.
\r
478 public override Type ValueType {
\r
479 get { return typeof (decimal); }
\r
482 public override object ParseValue (string s,
\r
483 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
485 decimal d = XmlConvert.ToDecimal (Normalize (s));
\r
486 if (Decimal.Floor (d) != d)
\r
487 throw new FormatException ("Integer contains point number.");
\r
493 public class XsdLong : XsdInteger
\r
495 public override Type ValueType {
\r
496 get { return typeof (long); }
\r
499 public override object ParseValue (string s,
\r
500 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
502 return XmlConvert.ToInt64 (Normalize (s));
\r
507 public class XsdInt : XsdLong
\r
509 public override Type ValueType {
\r
510 get { return typeof (int); }
\r
513 public override object ParseValue (string s,
\r
514 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
516 return XmlConvert.ToInt32 (Normalize (s));
\r
522 public class XsdShort : XsdInt
\r
524 public override Type ValueType {
\r
525 get { return typeof (short); }
\r
528 public override object ParseValue (string s,
\r
529 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
531 return XmlConvert.ToInt16 (Normalize (s));
\r
536 public class XsdByte : XsdShort
\r
538 public override Type ValueType {
\r
539 get { return typeof (byte); }
\r
542 public override object ParseValue (string s,
\r
543 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
545 return XmlConvert.ToByte (Normalize (s));
\r
549 // xs:nonNegativeInteger
\r
550 [CLSCompliant (false)]
\r
551 public class XsdNonNegativeInteger : XsdInteger
\r
553 public override Type ValueType {
\r
554 get { return typeof (decimal); }
\r
557 [CLSCompliant (false)]
\r
558 public override object ParseValue (string s,
\r
559 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
561 return XmlConvert.ToDecimal (Normalize (s));
\r
566 [CLSCompliant (false)]
\r
567 public class XsdUnsignedLong : XsdNonNegativeInteger
\r
569 public override Type ValueType {
\r
570 get { return typeof (ulong); }
\r
573 public override object ParseValue (string s,
\r
574 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
576 return XmlConvert.ToUInt64 (Normalize (s));
\r
581 [CLSCompliant (false)]
\r
582 public class XsdUnsignedInt : XsdUnsignedLong
\r
584 public override Type ValueType {
\r
585 get { return typeof (uint); }
\r
588 public override object ParseValue (string s,
\r
589 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
591 return XmlConvert.ToUInt32 (Normalize (s));
\r
596 // xs:unsignedShort
\r
597 [CLSCompliant (false)]
\r
598 public class XsdUnsignedShort : XsdUnsignedInt
\r
600 public override Type ValueType {
\r
601 get { return typeof (ushort); }
\r
604 public override object ParseValue (string s,
\r
605 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
607 return XmlConvert.ToUInt16 (Normalize (s));
\r
612 [CLSCompliant (false)]
\r
613 public class XsdUnsignedByte : XsdUnsignedShort
\r
615 public override Type ValueType {
\r
616 get { return typeof (byte); }
\r
619 public override object ParseValue (string s,
\r
620 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
622 return XmlConvert.ToByte(Normalize (s));
\r
627 // xs:positiveInteger
\r
628 [CLSCompliant (false)]
\r
629 public class XsdPositiveInteger : XsdNonNegativeInteger
\r
631 // It returns decimal, instead of int or long.
\r
632 // Maybe MS developers thought about big integer...
\r
633 public override Type ValueType {
\r
634 get { return typeof (decimal); }
\r
637 public override object ParseValue (string s,
\r
638 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
640 return XmlConvert.ToDecimal (Normalize (s));
\r
644 // xs:nonPositiveInteger
\r
645 public class XsdNonPositiveInteger : XsdInteger
\r
647 public override Type ValueType {
\r
648 get { return typeof (decimal); }
\r
651 public override object ParseValue (string s,
\r
652 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
654 return XmlConvert.ToDecimal (Normalize (s));
\r
658 // xs:negativeInteger
\r
659 public class XsdNegativeInteger : XsdNonPositiveInteger
\r
661 public override Type ValueType {
\r
663 get { return typeof (decimal); }
\r
666 public override object ParseValue (string s,
\r
667 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
669 return XmlConvert.ToDecimal (Normalize (s));
\r
674 public class XsdFloat : XsdAnySimpleType
\r
676 // Fundamental Facets
\r
677 public override bool Bounded {
\r
678 get { return true; }
\r
680 public override bool Finite {
\r
681 get { return true; }
\r
683 public override bool Numeric {
\r
684 get { return true; }
\r
686 public override XsdOrderedFacet Ordered {
\r
687 get { return XsdOrderedFacet.Total; }
\r
690 public override Type ValueType {
\r
691 get { return typeof (float); }
\r
694 public override object ParseValue (string s,
\r
695 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
697 return XmlConvert.ToSingle (Normalize (s));
\r
702 public class XsdDouble : XsdAnySimpleType
\r
704 // Fundamental Facets
\r
705 public override bool Bounded {
\r
706 get { return true; }
\r
708 public override bool Finite {
\r
709 get { return true; }
\r
711 public override bool Numeric {
\r
712 get { return true; }
\r
714 public override XsdOrderedFacet Ordered {
\r
715 get { return XsdOrderedFacet.Total; }
\r
718 public override Type ValueType {
\r
719 get { return typeof (double); }
\r
722 public override object ParseValue (string s,
\r
723 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
725 return XmlConvert.ToDouble (Normalize (s));
\r
730 public class XsdBase64Binary : XsdString
\r
732 internal XsdBase64Binary ()
\r
736 public override Type ValueType {
\r
737 get { return typeof (byte[]); }
\r
740 public override object ParseValue (string s,
\r
741 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
743 return Convert.FromBase64String (Normalize (s));
\r
748 public class XsdHexBinary : XsdAnySimpleType
\r
750 internal XsdHexBinary ()
\r
754 public override XmlTokenizedType TokenizedType {
\r
755 get { return XmlTokenizedType.None; }
\r
758 public override Type ValueType {
\r
759 get { return typeof (byte []); }
\r
762 public override object ParseValue (string s,
\r
763 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
765 return XmlConvert.FromBinHexString (Normalize (s));
\r
768 // Fundamental Facets ... no need to override
\r
772 public class XsdQName : XsdName
\r
774 internal XsdQName ()
\r
778 // Fundamental facets are the same as anySimpleType.
\r
780 public override XmlTokenizedType TokenizedType {
\r
781 get { return XmlTokenizedType.QName; }
\r
784 public override Type ValueType {
\r
785 get { return typeof (XmlQualifiedName); }
\r
788 // ParseValue () method is as same as that of xs:string
\r
789 public override object ParseValue (string s,
\r
790 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
792 if (nameTable == null)
\r
793 throw new ArgumentNullException ("name table");
\r
795 throw new ArgumentNullException ("namespace manager");
\r
796 int colonAt = s.IndexOf (':');
\r
797 string localName =
\r
798 nameTable.Add (colonAt < 0 ? s : s.Substring (colonAt + 1));
\r
799 return new XmlQualifiedName (localName, nsmgr.LookupNamespace (
\r
800 colonAt < 0 ? "" : s.Substring (0, colonAt - 1)));
\r
805 public class XsdBoolean : XsdAnySimpleType
\r
807 internal XsdBoolean ()
\r
811 public override XmlTokenizedType TokenizedType {
\r
812 get { return XmlTokenizedType.CDATA; }
\r
815 public override Type ValueType {
\r
816 get { return typeof (bool); }
\r
819 public override object ParseValue (string s,
\r
820 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
822 return XmlConvert.ToBoolean (this.Normalize (s));
\r
825 // Fundamental Facets
\r
826 public override bool Bounded {
\r
827 get { return false; }
\r
829 public override bool Finite {
\r
830 get { return true; }
\r
832 public override bool Numeric {
\r
833 get { return false; }
\r
835 public override XsdOrderedFacet Ordered {
\r
836 get { return XsdOrderedFacet.Total; }
\r
841 public class XsdAnyURI : XsdString
\r
843 public override XmlTokenizedType TokenizedType {
\r
845 get { return XmlTokenizedType.CDATA; }
\r
848 public override Type ValueType {
\r
849 get { return typeof (Uri); }
\r
852 public override object ParseValue (string s,
\r
853 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
855 return new Uri (Normalize (s));
\r
860 public class XsdDuration : XsdAnySimpleType
\r
862 internal XsdDuration ()
\r
866 public override XmlTokenizedType TokenizedType {
\r
867 get { return XmlTokenizedType.CDATA; }
\r
870 public override Type ValueType {
\r
871 get { return typeof (TimeSpan); }
\r
874 public override object ParseValue (string s,
\r
875 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
877 return XmlConvert.ToTimeSpan (Normalize (s));
\r
880 // Fundamental Facets
\r
881 public override bool Bounded {
\r
882 get { return false; }
\r
884 public override bool Finite {
\r
885 get { return false; }
\r
887 public override bool Numeric {
\r
888 get { return false; }
\r
890 public override XsdOrderedFacet Ordered {
\r
891 get { return XsdOrderedFacet.Partial; }
\r
896 public class XsdDateTime : XsdAnySimpleType
\r
898 internal XsdDateTime ()
\r
902 public override XmlTokenizedType TokenizedType {
\r
903 get { return XmlTokenizedType.CDATA; }
\r
906 public override Type ValueType {
\r
907 get { return typeof (DateTime); }
\r
910 public override object ParseValue (string s,
\r
911 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
913 return XmlConvert.ToDateTime (Normalize (s));
\r
916 // Fundamental Facets
\r
917 public override bool Bounded {
\r
918 get { return false; }
\r
920 public override bool Finite {
\r
921 get { return false; }
\r
923 public override bool Numeric {
\r
924 get { return false; }
\r
926 public override XsdOrderedFacet Ordered {
\r
927 get { return XsdOrderedFacet.Partial; }
\r
932 public class XsdDate : XsdAnySimpleType
\r
934 public override XmlTokenizedType TokenizedType {
\r
935 get { return XmlTokenizedType.CDATA; }
\r
938 public override Type ValueType {
\r
939 get { return typeof (DateTime); }
\r
942 public override object ParseValue (string s,
\r
943 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
945 return DateTime.ParseExact (Normalize (s), "yyyy-MM-dd", null);
\r
948 // Fundamental Facets ... no need to override except for Ordered.
\r
949 public override XsdOrderedFacet Ordered {
\r
950 get { return XsdOrderedFacet.Partial; }
\r
955 public class XsdTime : XsdAnySimpleType
\r
957 static string [] timeFormats = new string [] {
\r
958 // copied from XmlConvert.
973 "HH:mm:ss.ffffffzzz",
974 "HH:mm:ss.fffffffzzz",
982 "HH:mm:ss.fffffffZ"};
984 public override XmlTokenizedType TokenizedType {
\r
985 get { return XmlTokenizedType.CDATA; }
\r
988 public override Type ValueType {
\r
989 get { return typeof (DateTime); }
\r
992 public override object ParseValue (string s,
\r
993 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
995 return DateTime.ParseExact (Normalize (s), timeFormats, null, DateTimeStyles.None);
\r
998 // Fundamental Facets ... no need to override except for Ordered.
\r
999 public override XsdOrderedFacet Ordered {
\r
1000 get { return XsdOrderedFacet.Partial; }
\r
1005 public class XsdGYearMonth : XsdAnySimpleType
\r
1007 public override Type ValueType {
\r
1008 get { return typeof (DateTime); }
\r
1011 public override object ParseValue (string s,
\r
1012 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
1014 return DateTime.ParseExact (Normalize (s), "yyyy-MM", null);
\r
1019 public class XsdGMonthDay : XsdAnySimpleType
\r
1021 public override Type ValueType {
\r
1022 get { return typeof (DateTime); }
\r
1025 public override object ParseValue (string s,
\r
1026 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
1028 return DateTime.ParseExact (Normalize (s), "--MM-dd", null);
\r
1033 public class XsdGYear : XsdAnySimpleType
\r
1035 public override Type ValueType {
\r
1036 get { return typeof (DateTime); }
\r
1039 // LAMESPEC: XML Schema Datatypes allows leading '-' to identify B.C. years,
\r
1040 // but CLR DateTime does not allow such expression.
\r
1041 public override object ParseValue (string s,
\r
1042 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
1044 return DateTime.ParseExact (s, "yyyy", null);
\r
1049 public class XsdGMonth : XsdAnySimpleType
\r
1051 public override Type ValueType {
\r
1052 get { return typeof (DateTime); }
\r
1055 public override object ParseValue (string s,
\r
1056 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
1058 return DateTime.ParseExact (s, "--MM--", null);
\r
1063 public class XsdGDay : XsdAnySimpleType
\r
1065 public override Type ValueType {
\r
1066 get { return typeof (DateTime); }
\r
1069 public override object ParseValue (string s,
\r
1070 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
1072 return DateTime.ParseExact (s, "---dd", null);
\r