2 // System.Xml.Schema.XmlSchemaDatatype.cs
\r
7 // (C)2003 Atsushi Enomoto
\r
10 using System.Collections;
\r
13 using System.Xml.Schema;
\r
15 namespace Mono.Xml.Schema
\r
17 public enum XsdWhitespaceFacet
\r
24 public enum XsdOrderedFacet
\r
31 public class XsdAnySimpleType : XmlSchemaDatatype
\r
33 static XsdAnySimpleType instance;
\r
34 static XsdAnySimpleType ()
\r
36 instance = new XsdAnySimpleType ();
\r
39 public static XsdAnySimpleType Instance {
\r
40 get { return instance; }
\r
43 readonly char [] whitespaceArray = new char [] {' '};
\r
45 // Fundamental Facets
\r
46 public virtual bool Bounded {
\r
47 get { return false; }
\r
50 public virtual bool Finite {
\r
51 get { return false; }
\r
54 public virtual bool Numeric {
\r
55 get { return false; }
\r
58 public virtual XsdOrderedFacet Ordered {
\r
59 get { return XsdOrderedFacet.False; }
\r
62 public override Type ValueType {
\r
63 get { return typeof (object); }
\r
66 public override XmlTokenizedType TokenizedType {
\r
68 return XmlTokenizedType.None;
\r
72 public override object ParseValue (string s,
\r
73 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
75 return Normalize (s);
\r
78 internal object ParseListValue (string s,
\r
79 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
81 return this.Normalize (s).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 // Constraining Facets
\r
115 public bool HasLengthFacet;
\r
116 public bool HasMaxLengthFacet;
\r
117 public bool HasMinLengthFacet;
\r
119 public int MaxLength;
\r
120 public int MinLength;
\r
121 public string Pattern;
\r
122 public ICollection Enumeration;
\r
125 // xs:normalizedString
\r
126 public class XsdNormalizedString : XsdString
\r
128 internal XsdNormalizedString ()
\r
130 this.WhitespaceValue = XsdWhitespaceFacet.Replace;
\r
133 public override XmlTokenizedType TokenizedType {
\r
135 get { return XmlTokenizedType.CDATA; }
\r
138 public override Type ValueType {
\r
139 get { return typeof (string); }
\r
142 // ParseValue () method is as same as that of xs:string
\r
146 public class XsdToken : XsdNormalizedString
\r
148 internal XsdToken ()
\r
150 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
\r
153 public override XmlTokenizedType TokenizedType {
\r
154 get { return XmlTokenizedType.CDATA; }
\r
157 public override Type ValueType {
\r
158 get { return typeof (string); }
\r
161 // ParseValue () method is as same as that of xs:string
\r
165 public class XsdLanguage : XsdToken
\r
167 internal XsdLanguage ()
\r
171 public override XmlTokenizedType TokenizedType {
\r
172 get { return XmlTokenizedType.CDATA; }
\r
175 public override Type ValueType {
\r
176 get { return typeof (string); }
\r
179 // ParseValue () method is as same as that of xs:string
\r
183 public class XsdNMToken : XsdToken
\r
185 internal XsdNMToken ()
\r
189 public override XmlTokenizedType TokenizedType {
\r
190 get { return XmlTokenizedType.NMTOKEN; }
\r
193 public override Type ValueType {
\r
194 get { return typeof (string); }
\r
197 public override object ParseValue (string s,
\r
198 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
200 if (!XmlChar.IsNmToken (s))
\r
201 throw new ArgumentException ("'" + s + "' is an invalid NMTOKEN.");
\r
208 public class XsdNMTokens : XsdNMToken
\r
210 internal XsdNMTokens ()
\r
214 public override XmlTokenizedType TokenizedType {
\r
215 get { return XmlTokenizedType.NMTOKENS; }
\r
218 public override Type ValueType {
\r
219 get { return typeof (string []); }
\r
222 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
224 return ParseListValue (value, nt, nsmgr);
\r
229 public class XsdName : XsdToken
\r
231 internal XsdName ()
\r
235 public override XmlTokenizedType TokenizedType {
\r
236 get { return XmlTokenizedType.CDATA; }
\r
239 public override Type ValueType {
\r
240 get { return typeof (string); }
\r
243 public override object ParseValue (string s,
\r
244 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
246 if (!XmlChar.IsName (s))
\r
247 throw new ArgumentException ("'" + s + "' is an invalid name.");
\r
253 public class XsdNCName : XsdName
\r
255 internal XsdNCName ()
\r
259 public override XmlTokenizedType TokenizedType {
\r
260 get { return XmlTokenizedType.NCName; }
\r
263 public override Type ValueType {
\r
264 get { return typeof (string); }
\r
267 public override object ParseValue (string s,
\r
268 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
270 if (!XmlChar.IsNCName (s))
\r
271 throw new ArgumentException ("'" + s + "' is an invalid NCName.");
\r
278 public class XsdID : XsdName
\r
284 public override XmlTokenizedType TokenizedType {
\r
285 get { return XmlTokenizedType.ID; }
\r
288 public override Type ValueType {
\r
289 get { return typeof (string); }
\r
292 // ParseValue () method is as same as that of xs:string
\r
296 public class XsdIDRef : XsdName
\r
298 internal XsdIDRef ()
\r
302 public override XmlTokenizedType TokenizedType {
\r
303 get { return XmlTokenizedType.IDREF; }
\r
306 public override Type ValueType {
\r
307 get { return typeof (string); }
\r
310 // ParseValue () method is as same as that of xs:string
\r
314 public class XsdIDRefs : XsdName
\r
316 internal XsdIDRefs ()
\r
320 public override XmlTokenizedType TokenizedType {
\r
321 get { return XmlTokenizedType.IDREFS; }
\r
324 public override Type ValueType {
\r
325 get { return typeof (string []); }
\r
328 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
330 return ParseListValue (value, nt, nsmgr);
\r
335 public class XsdEntity : XsdName
\r
337 internal XsdEntity ()
\r
342 public override XmlTokenizedType TokenizedType {
\r
343 get { return XmlTokenizedType.ENTITY; }
\r
346 public override Type ValueType {
\r
347 get { return typeof (string); }
\r
350 // ParseValue () method is as same as that of xs:string
\r
355 public class XsdEntities : XsdName
\r
357 internal XsdEntities ()
\r
361 public override XmlTokenizedType TokenizedType {
\r
362 get { return XmlTokenizedType.ENTITIES; }
\r
365 public override Type ValueType {
\r
366 get { return typeof (string []); }
\r
369 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
371 return ParseListValue (value, nt, nsmgr);
\r
376 public class XsdNotation : XsdAnySimpleType
\r
378 internal XsdNotation ()
\r
382 public override XmlTokenizedType TokenizedType {
\r
383 get { return XmlTokenizedType.NOTATION; }
\r
386 public override Type ValueType {
\r
387 get { return typeof (string); }
\r
390 public override object ParseValue (string s,
\r
391 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
393 return Normalize (s);
\r
396 // Fundamental Facets
\r
397 public override bool Bounded {
\r
398 get { return false; }
\r
400 public override bool Finite {
\r
401 get { return false; }
\r
403 public override bool Numeric {
\r
404 get { return false; }
\r
406 public override XsdOrderedFacet Ordered {
\r
407 get { return XsdOrderedFacet.False; }
\r
410 // Constraining Facets
\r
411 public bool HasLengthFacet;
\r
412 public bool HasMaxLengthFacet;
\r
413 public bool HasMinLengthFacet;
\r
415 public int MaxLength;
\r
416 public int MinLength;
\r
417 public string Pattern;
\r
418 public ICollection Enumeration;
\r
422 public class XsdDecimal : XsdAnySimpleType
\r
424 internal XsdDecimal ()
\r
428 public override XmlTokenizedType TokenizedType {
\r
429 get { return XmlTokenizedType.None; }
\r
432 public override Type ValueType {
\r
433 get { return typeof (decimal); }
\r
436 public override object ParseValue (string s,
\r
437 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
439 return XmlConvert.ToDecimal (this.Normalize (s));
\r
442 // Fundamental Facets
\r
443 public override bool Bounded {
\r
444 get { return false; }
\r
446 public override bool Finite {
\r
447 get { return false; }
\r
449 public override bool Numeric {
\r
450 get { return true; }
\r
452 public override XsdOrderedFacet Ordered {
\r
453 get { return XsdOrderedFacet.Total; }
\r
456 // Constraining Facets
\r
457 public bool HasLengthFacet;
\r
458 public bool HasMaxLengthFacet;
\r
459 public bool HasMinLengthFacet;
\r
461 public int MaxLength;
\r
462 public int MinLength;
\r
463 public string Pattern;
\r
464 public ICollection Enumeration;
\r
468 public class XsdInteger : XsdDecimal
\r
470 public XsdInteger ()
\r
472 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
\r
475 // Here it may be bigger than int's (or long's) MaxValue.
\r
476 public override Type ValueType {
\r
477 get { return typeof (decimal); }
\r
480 public override object ParseValue (string s,
\r
481 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
483 return XmlConvert.ToDecimal (Normalize (s));
\r
488 public class XsdLong : XsdInteger
\r
490 public override Type ValueType {
\r
491 get { return typeof (long); }
\r
494 public override object ParseValue (string s,
\r
495 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
497 return XmlConvert.ToInt64 (Normalize (s));
\r
502 public class XsdInt : XsdLong
\r
504 public override Type ValueType {
\r
505 get { return typeof (int); }
\r
508 public override object ParseValue (string s,
\r
509 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
511 return XmlConvert.ToInt32 (Normalize (s));
\r
517 public class XsdShort : XsdInt
\r
519 public override Type ValueType {
\r
520 get { return typeof (short); }
\r
523 public override object ParseValue (string s,
\r
524 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
526 return XmlConvert.ToInt16 (Normalize (s));
\r
531 public class XsdByte : XsdShort
\r
533 public override Type ValueType {
\r
534 get { return typeof (byte); }
\r
537 public override object ParseValue (string s,
\r
538 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
540 return XmlConvert.ToByte (Normalize (s));
\r
544 // xs:nonNegativeInteger
\r
545 [CLSCompliant (false)]
\r
546 public class XsdNonNegativeInteger : XsdInteger
\r
548 public override Type ValueType {
\r
549 get { return typeof (decimal); }
\r
552 [CLSCompliant (false)]
\r
553 public override object ParseValue (string s,
\r
554 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
556 return XmlConvert.ToDecimal (Normalize (s));
\r
561 [CLSCompliant (false)]
\r
562 public class XsdUnsignedLong : XsdNonNegativeInteger
\r
564 public override Type ValueType {
\r
565 get { return typeof (ulong); }
\r
568 public override object ParseValue (string s,
\r
569 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
571 return XmlConvert.ToUInt64 (Normalize (s));
\r
576 [CLSCompliant (false)]
\r
577 public class XsdUnsignedInt : XsdUnsignedLong
\r
579 public override Type ValueType {
\r
580 get { return typeof (uint); }
\r
583 public override object ParseValue (string s,
\r
584 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
586 return XmlConvert.ToUInt32 (Normalize (s));
\r
591 // xs:unsignedShort
\r
592 [CLSCompliant (false)]
\r
593 public class XsdUnsignedShort : XsdUnsignedInt
\r
595 public override Type ValueType {
\r
596 get { return typeof (ushort); }
\r
599 public override object ParseValue (string s,
\r
600 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
602 return XmlConvert.ToUInt16 (Normalize (s));
\r
607 [CLSCompliant (false)]
\r
608 public class XsdUnsignedByte : XsdUnsignedShort
\r
610 public override Type ValueType {
\r
611 get { return typeof (byte); }
\r
614 public override object ParseValue (string s,
\r
615 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
617 return XmlConvert.ToByte(Normalize (s));
\r
622 // xs:positiveInteger
\r
623 public class XsdPositiveInteger : XsdNonNegativeInteger
\r
625 // It returns decimal, instead of int or long.
\r
626 // Maybe MS developers thought about big integer...
\r
627 public override Type ValueType {
\r
628 get { return typeof (decimal); }
\r
631 public override object ParseValue (string s,
\r
632 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
634 return XmlConvert.ToDecimal (Normalize (s));
\r
638 // xs:nonPositiveInteger
\r
639 public class XsdNonPositiveInteger : XsdInteger
\r
641 public override Type ValueType {
\r
642 get { return typeof (decimal); }
\r
645 public override object ParseValue (string s,
\r
646 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
648 return XmlConvert.ToDecimal (Normalize (s));
\r
652 // xs:negativeInteger
\r
653 public class XsdNegativeInteger : XsdNonPositiveInteger
\r
655 public override Type ValueType {
\r
657 get { return typeof (decimal); }
\r
660 public override object ParseValue (string s,
\r
661 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
663 return XmlConvert.ToDecimal (Normalize (s));
\r
668 public class XsdFloat : XsdAnySimpleType
\r
670 // Fundamental Facets
\r
671 public override bool Bounded {
\r
672 get { return true; }
\r
674 public override bool Finite {
\r
675 get { return true; }
\r
677 public override bool Numeric {
\r
678 get { return true; }
\r
680 public override XsdOrderedFacet Ordered {
\r
681 get { return XsdOrderedFacet.Total; }
\r
684 public override Type ValueType {
\r
685 get { return typeof (float); }
\r
688 public override object ParseValue (string s,
\r
689 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
691 return XmlConvert.ToSingle (Normalize (s));
\r
696 public class XsdDouble : XsdAnySimpleType
\r
698 // Fundamental Facets
\r
699 public override bool Bounded {
\r
700 get { return true; }
\r
702 public override bool Finite {
\r
703 get { return true; }
\r
705 public override bool Numeric {
\r
706 get { return true; }
\r
708 public override XsdOrderedFacet Ordered {
\r
709 get { return XsdOrderedFacet.Total; }
\r
712 public override Type ValueType {
\r
713 get { return typeof (double); }
\r
716 public override object ParseValue (string s,
\r
717 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
719 return XmlConvert.ToDouble (Normalize (s));
\r
724 public class XsdBase64Binary : XsdString
\r
726 internal XsdBase64Binary ()
\r
730 public override Type ValueType {
\r
731 get { return typeof (byte[]); }
\r
734 public override object ParseValue (string s,
\r
735 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
737 return Convert.FromBase64String (s);
\r
742 public class XsdHexBinary : XsdAnySimpleType
\r
744 internal XsdHexBinary ()
\r
748 public override XmlTokenizedType TokenizedType {
\r
749 get { return XmlTokenizedType.None; }
\r
752 public override Type ValueType {
\r
753 get { return typeof (byte []); }
\r
757 public override object ParseValue (string s,
\r
758 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
760 throw new NotImplementedException ();
\r
763 // Fundamental Facets ... no need to override
\r
767 public class XsdQName : XsdName
\r
769 internal XsdQName ()
\r
773 // Fundamental facets are the same as anySimpleType.
\r
775 public override XmlTokenizedType TokenizedType {
\r
776 get { return XmlTokenizedType.QName; }
\r
779 public override Type ValueType {
\r
780 get { return typeof (XmlQualifiedName); }
\r
783 // ParseValue () method is as same as that of xs:string
\r
784 public override object ParseValue (string s,
\r
785 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
787 if (nameTable == null)
\r
788 throw new ArgumentNullException ("name table");
\r
790 throw new ArgumentNullException ("namespace manager");
\r
791 int colonAt = s.IndexOf (':');
\r
792 string localName =
\r
793 nameTable.Add (colonAt < 0 ? s : s.Substring (colonAt + 1));
\r
794 return new XmlQualifiedName (localName, nsmgr.LookupNamespace (
\r
795 colonAt < 0 ? "" : s.Substring (0, colonAt - 1)));
\r
800 public class XsdBoolean : XsdAnySimpleType
\r
802 internal XsdBoolean ()
\r
806 public override XmlTokenizedType TokenizedType {
\r
807 get { return XmlTokenizedType.CDATA; }
\r
810 public override Type ValueType {
\r
811 get { return typeof (bool); }
\r
814 public override object ParseValue (string s,
\r
815 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
817 return XmlConvert.ToBoolean (this.Normalize (s));
\r
820 // Fundamental Facets
\r
821 public override bool Bounded {
\r
822 get { return false; }
\r
824 public override bool Finite {
\r
825 get { return true; }
\r
827 public override bool Numeric {
\r
828 get { return false; }
\r
830 public override XsdOrderedFacet Ordered {
\r
831 get { return XsdOrderedFacet.Total; }
\r
836 public class XsdAnyURI : XsdString
\r
838 public override XmlTokenizedType TokenizedType {
\r
840 get { return XmlTokenizedType.CDATA; }
\r
843 public override Type ValueType {
\r
844 get { return typeof (Uri); }
\r
847 public override object ParseValue (string s,
\r
848 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
850 return new Uri (s);
\r
855 public class XsdDuration : XsdAnySimpleType
\r
857 internal XsdDuration ()
\r
861 public override XmlTokenizedType TokenizedType {
\r
862 get { return XmlTokenizedType.CDATA; }
\r
865 public override Type ValueType {
\r
866 get { return typeof (TimeSpan); }
\r
869 public override object ParseValue (string s,
\r
870 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
872 return XmlConvert.ToTimeSpan (s);
\r
875 // Fundamental Facets
\r
876 public override bool Bounded {
\r
877 get { return false; }
\r
879 public override bool Finite {
\r
880 get { return false; }
\r
882 public override bool Numeric {
\r
883 get { return false; }
\r
885 public override XsdOrderedFacet Ordered {
\r
886 get { return XsdOrderedFacet.Partial; }
\r
891 public class XsdDateTime : XsdAnySimpleType
\r
893 internal XsdDateTime ()
\r
897 public override XmlTokenizedType TokenizedType {
\r
898 get { return XmlTokenizedType.CDATA; }
\r
901 public override Type ValueType {
\r
902 get { return typeof (DateTime); }
\r
905 public override object ParseValue (string s,
\r
906 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
908 return XmlConvert.ToDateTime (s);
\r
911 // Fundamental Facets
\r
912 public override bool Bounded {
\r
913 get { return false; }
\r
915 public override bool Finite {
\r
916 get { return false; }
\r
918 public override bool Numeric {
\r
919 get { return false; }
\r
921 public override XsdOrderedFacet Ordered {
\r
922 get { return XsdOrderedFacet.Partial; }
\r
927 public class XsdDate : XsdDateTime
\r
929 public override object ParseValue (string s,
\r
930 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
932 return DateTime.ParseExact (s, "yyyy-MM-dd", null);
\r
937 public class XsdTime : XsdDateTime
\r
939 public override object ParseValue (string s,
\r
940 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
942 return DateTime.ParseExact (s, "HH:mm:ss.fffffffzzz", null);
\r
947 public class XsdGYearMonth : XsdAnySimpleType
\r
949 public override Type ValueType {
\r
950 get { return typeof (DateTime); }
\r
954 public override object ParseValue (string s,
\r
955 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
957 return XmlConvert.ToDateTime (Normalize (s));
\r
962 public class XsdGMonthDay : XsdAnySimpleType
\r
964 public override Type ValueType {
\r
965 get { return typeof (DateTime); }
\r
969 public override object ParseValue (string s,
\r
970 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
972 return XmlConvert.ToDateTime (Normalize (s));
\r
977 public class XsdGYear : XsdAnySimpleType
\r
979 public override Type ValueType {
\r
980 get { return typeof (DateTime); }
\r
984 public override object ParseValue (string s,
\r
985 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
987 return new DateTime (int.Parse (s), 1, 1);
\r
992 public class XsdGMonth : XsdAnySimpleType
\r
994 public override Type ValueType {
\r
995 get { return typeof (DateTime); }
\r
999 public override object ParseValue (string s,
\r
1000 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
1002 return new DateTime (0, int.Parse (s), 1);
\r
1007 public class XsdGDay : XsdAnySimpleType
\r
1009 public override Type ValueType {
\r
1010 get { return typeof (DateTime); }
\r
1014 public override object ParseValue (string s,
\r
1015 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
1017 return new DateTime (0, 1, int.Parse (s));
\r