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 abstract class XsdAnySimpleType : XmlSchemaDatatype
\r
33 // Fundamental Facets
\r
34 public abstract bool Bounded { get; }
\r
36 public abstract bool Finite { get; }
\r
38 public abstract bool Numeric { get; }
\r
40 public abstract XsdOrderedFacet Ordered { get; }
\r
45 public class XsdString : XsdAnySimpleType
\r
47 internal XsdString ()
\r
51 public override XmlTokenizedType TokenizedType {
\r
52 get { return XmlTokenizedType.CDATA; }
\r
55 public override Type ValueType {
\r
56 get { return typeof (string); }
\r
59 public override object ParseValue (string s,
\r
60 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
62 return Normalize (s);
\r
65 // Fundamental Facets
\r
66 public override bool Bounded {
\r
67 get { return false; }
\r
69 public override bool Finite {
\r
70 get { return false; }
\r
72 public override bool Numeric {
\r
73 get { return false; }
\r
75 public override XsdOrderedFacet Ordered {
\r
76 get { return XsdOrderedFacet.False; }
\r
79 // Constraining Facets
\r
80 public bool HasLengthFacet;
\r
81 public bool HasMaxLengthFacet;
\r
82 public bool HasMinLengthFacet;
\r
84 public int MaxLength;
\r
85 public int MinLength;
\r
86 public string Pattern;
\r
87 public ICollection Enumeration;
\r
90 // xs:normalizedString
\r
91 public class XsdNormalizedString : XsdString
\r
93 internal XsdNormalizedString ()
\r
95 this.WhitespaceValue = XsdWhitespaceFacet.Replace;
\r
98 public override XmlTokenizedType TokenizedType {
\r
100 get { return XmlTokenizedType.CDATA; }
\r
103 public override Type ValueType {
\r
104 get { return typeof (string); }
\r
107 // ParseValue () method is as same as that of xs:string
\r
111 public class XsdToken : XsdNormalizedString
\r
113 internal XsdToken ()
\r
115 this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
\r
118 public override XmlTokenizedType TokenizedType {
\r
119 get { return XmlTokenizedType.CDATA; }
\r
122 public override Type ValueType {
\r
123 get { return typeof (string); }
\r
126 // ParseValue () method is as same as that of xs:string
\r
130 public class XsdLanguage : XsdToken
\r
132 internal XsdLanguage ()
\r
136 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 XsdNMToken : XsdToken
\r
150 internal XsdNMToken ()
\r
154 public override XmlTokenizedType TokenizedType {
\r
155 get { return XmlTokenizedType.NMTOKEN; }
\r
158 public override Type ValueType {
\r
159 get { return typeof (string); }
\r
162 // ParseValue () method is as same as that of xs:string
\r
166 public class XsdNMTokens : XsdNMToken
\r
168 internal XsdNMTokens ()
\r
172 public override XmlTokenizedType TokenizedType {
\r
173 get { return XmlTokenizedType.NMTOKENS; }
\r
176 public override Type ValueType {
\r
177 get { return typeof (string []); }
\r
180 readonly char [] whitespaceArray = new char [] {' '};
\r
181 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
183 return this.Normalize (value).Split (whitespaceArray);
\r
188 public class XsdName : XsdToken
\r
190 internal XsdName ()
\r
194 public override XmlTokenizedType TokenizedType {
\r
195 get { return XmlTokenizedType.CDATA; }
\r
198 public override Type ValueType {
\r
199 get { return typeof (string); }
\r
202 // ParseValue () method is as same as that of xs:string
\r
206 public class XsdNCName : XsdName
\r
208 internal XsdNCName ()
\r
212 public override XmlTokenizedType TokenizedType {
\r
213 get { return XmlTokenizedType.NCName; }
\r
216 public override Type ValueType {
\r
217 get { return typeof (string); }
\r
220 // ParseValue () method is as same as that of xs:string
\r
224 public class XsdID : XsdName
\r
230 public override XmlTokenizedType TokenizedType {
\r
231 get { return XmlTokenizedType.ID; }
\r
234 public override Type ValueType {
\r
235 get { return typeof (string); }
\r
238 // ParseValue () method is as same as that of xs:string
\r
242 public class XsdIDRef : XsdName
\r
244 internal XsdIDRef ()
\r
248 public override XmlTokenizedType TokenizedType {
\r
249 get { return XmlTokenizedType.IDREF; }
\r
252 public override Type ValueType {
\r
253 get { return typeof (string); }
\r
256 // ParseValue () method is as same as that of xs:string
\r
260 public class XsdIDRefs : XsdName
\r
262 internal XsdIDRefs ()
\r
266 public override XmlTokenizedType TokenizedType {
\r
267 get { return XmlTokenizedType.IDREFS; }
\r
270 public override Type ValueType {
\r
271 get { return typeof (string []); }
\r
274 readonly char [] whitespaceArray = new char [] {' '};
\r
275 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
277 return this.Normalize (value).Split (whitespaceArray);
\r
282 public class XsdEntity : XsdName
\r
284 internal XsdEntity ()
\r
289 public override XmlTokenizedType TokenizedType {
\r
290 get { return XmlTokenizedType.ENTITY; }
\r
293 public override Type ValueType {
\r
294 get { return typeof (string); }
\r
297 // ParseValue () method is as same as that of xs:string
\r
302 public class XsdEntities : XsdName
\r
304 internal XsdEntities ()
\r
308 public override XmlTokenizedType TokenizedType {
\r
309 get { return XmlTokenizedType.ENTITIES; }
\r
312 public override Type ValueType {
\r
313 get { return typeof (string []); }
\r
316 readonly char [] whitespaceArray = new char [] {' '};
\r
317 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
319 return this.Normalize (value).Split (whitespaceArray);
\r
324 public class XsdNotation : XsdAnySimpleType
\r
326 internal XsdNotation ()
\r
330 public override XmlTokenizedType TokenizedType {
\r
331 get { return XmlTokenizedType.NOTATION; }
\r
334 public override Type ValueType {
\r
335 get { return typeof (string); }
\r
338 public override object ParseValue (string s,
\r
339 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
341 throw new NotImplementedException ();
\r
344 // Fundamental Facets
\r
345 public override bool Bounded {
\r
346 get { return false; }
\r
348 public override bool Finite {
\r
349 get { return false; }
\r
351 public override bool Numeric {
\r
352 get { return false; }
\r
354 public override XsdOrderedFacet Ordered {
\r
355 get { return XsdOrderedFacet.False; }
\r
358 // Constraining Facets
\r
359 public bool HasLengthFacet;
\r
360 public bool HasMaxLengthFacet;
\r
361 public bool HasMinLengthFacet;
\r
363 public int MaxLength;
\r
364 public int MinLength;
\r
365 public string Pattern;
\r
366 public ICollection Enumeration;
\r
370 public class XsdDecimal : XsdAnySimpleType
\r
372 internal XsdDecimal ()
\r
376 public override XmlTokenizedType TokenizedType {
\r
377 get { return XmlTokenizedType.CDATA; }
\r
380 public override Type ValueType {
\r
381 get { return typeof (decimal); }
\r
384 public override object ParseValue (string s,
\r
385 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
387 return XmlConvert.ToDecimal (this.Normalize (s));
\r
390 // Fundamental Facets
\r
391 public override bool Bounded {
\r
392 get { return false; }
\r
394 public override bool Finite {
\r
395 get { return false; }
\r
397 public override bool Numeric {
\r
398 get { return true; }
\r
400 public override XsdOrderedFacet Ordered {
\r
401 get { return XsdOrderedFacet.Total; }
\r
404 // Constraining Facets
\r
405 public bool HasLengthFacet;
\r
406 public bool HasMaxLengthFacet;
\r
407 public bool HasMinLengthFacet;
\r
409 public int MaxLength;
\r
410 public int MinLength;
\r
411 public string Pattern;
\r
412 public ICollection Enumeration;
\r
416 public class XsdInteger : XsdDecimal
\r
418 // Here it may be bigger than int's (or long's) MaxValue.
\r
419 public override Type ValueType {
\r
420 get { return typeof (decimal); }
\r
423 public override object ParseValue (string s,
\r
424 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
426 return XmlConvert.ToDecimal (Normalize (s));
\r
431 public class XsdLong : XsdNonNegativeInteger
\r
433 public override Type ValueType {
\r
434 get { return typeof (long); }
\r
437 public override object ParseValue (string s,
\r
438 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
440 return XmlConvert.ToInt64 (Normalize (s));
\r
445 public class XsdInt : XsdLong
\r
447 public override Type ValueType {
\r
448 get { return typeof (int); }
\r
451 public override object ParseValue (string s,
\r
452 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
454 return XmlConvert.ToInt32 (Normalize (s));
\r
460 public class XsdShort : XsdInt
\r
462 public override Type ValueType {
\r
463 get { return typeof (short); }
\r
466 public override object ParseValue (string s,
\r
467 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
469 return XmlConvert.ToInt16 (Normalize (s));
\r
474 public class XsdByte : XsdShort
\r
476 public override Type ValueType {
\r
477 get { return typeof (byte); }
\r
480 public override object ParseValue (string s,
\r
481 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
483 return XmlConvert.ToByte (Normalize (s));
\r
487 // xs:nonNegativeInteger
\r
488 [CLSCompliant (false)]
\r
489 public class XsdNonNegativeInteger : XsdInteger
\r
491 public override Type ValueType {
\r
492 get { return typeof (decimal); }
\r
495 [CLSCompliant (false)]
\r
496 public override object ParseValue (string s,
\r
497 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
499 return XmlConvert.ToDecimal (Normalize (s));
\r
504 [CLSCompliant (false)]
\r
505 public class XsdUnsignedLong : XsdNonNegativeInteger
\r
507 public override Type ValueType {
\r
508 get { return typeof (ulong); }
\r
511 public override object ParseValue (string s,
\r
512 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
514 return XmlConvert.ToUInt64 (Normalize (s));
\r
519 [CLSCompliant (false)]
\r
520 public class XsdUnsignedInt : XsdUnsignedLong
\r
522 public override Type ValueType {
\r
523 get { return typeof (uint); }
\r
526 public override object ParseValue (string s,
\r
527 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
529 return XmlConvert.ToUInt32 (Normalize (s));
\r
534 // xs:unsignedShort
\r
535 [CLSCompliant (false)]
\r
536 public class XsdUnsignedShort : XsdUnsignedInt
\r
538 public override Type ValueType {
\r
539 get { return typeof (ushort); }
\r
542 public override object ParseValue (string s,
\r
543 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
545 return XmlConvert.ToUInt16 (Normalize (s));
\r
550 [CLSCompliant (false)]
\r
551 public class XsdUnsignedByte : XsdUnsignedShort
\r
553 public override Type ValueType {
\r
554 get { return typeof (byte); }
\r
557 public override object ParseValue (string s,
\r
558 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
560 return XmlConvert.ToByte(Normalize (s));
\r
565 // xs:positiveInteger
\r
566 public class XsdPositiveInteger : XsdNonNegativeInteger
\r
568 // It returns decimal, instead of int or long.
\r
569 // Maybe MS developers thought about big integer...
\r
570 public override Type ValueType {
\r
571 get { return typeof (decimal); }
\r
574 public override object ParseValue (string s,
\r
575 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
577 return XmlConvert.ToDecimal (Normalize (s));
\r
581 // xs:nonPositiveInteger
\r
582 public class XsdNonPositiveInteger : XsdInteger
\r
584 public override Type ValueType {
\r
585 get { return typeof (decimal); }
\r
588 public override object ParseValue (string s,
\r
589 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
591 return XmlConvert.ToDecimal (Normalize (s));
\r
595 // xs:negativeInteger
\r
596 public class XsdNegativeInteger : XsdNonPositiveInteger
\r
598 public override Type ValueType {
\r
600 get { return typeof (decimal); }
\r
603 public override object ParseValue (string s,
\r
604 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
606 return XmlConvert.ToDecimal (Normalize (s));
\r
611 public class XsdFloat : XsdDecimal
\r
613 public override Type ValueType {
\r
614 get { return typeof (float); }
\r
617 public override object ParseValue (string s,
\r
618 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
620 return XmlConvert.ToSingle (Normalize (s));
\r
625 public class XsdDouble : XsdDecimal
\r
627 public override Type ValueType {
\r
628 get { return typeof (double); }
\r
631 public override object ParseValue (string s,
\r
632 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
634 return XmlConvert.ToDouble (Normalize (s));
\r
639 public class XsdBase64Binary : XsdString
\r
641 internal XsdBase64Binary ()
\r
645 public override Type ValueType {
\r
646 get { return typeof (byte[]); }
\r
649 public override object ParseValue (string s,
\r
650 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
652 return Convert.FromBase64String (s);
\r
657 public class XsdBoolean : XsdAnySimpleType
\r
659 internal XsdBoolean ()
\r
663 public override XmlTokenizedType TokenizedType {
\r
664 get { return XmlTokenizedType.CDATA; }
\r
667 public override Type ValueType {
\r
668 get { return typeof (bool); }
\r
671 public override object ParseValue (string s,
\r
672 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
674 return XmlConvert.ToBoolean (this.Normalize (s));
\r
677 // Fundamental Facets
\r
678 public override bool Bounded {
\r
679 get { return false; }
\r
681 public override bool Finite {
\r
682 get { return true; }
\r
684 public override bool Numeric {
\r
685 get { return false; }
\r
687 public override XsdOrderedFacet Ordered {
\r
688 get { return XsdOrderedFacet.Total; }
\r
693 public class XsdAnyURI : XsdString
\r
695 public override XmlTokenizedType TokenizedType {
\r
697 get { return XmlTokenizedType.CDATA; }
\r
700 public override Type ValueType {
\r
701 get { return typeof (Uri); }
\r
704 public override object ParseValue (string s,
\r
705 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
707 return new Uri (s);
\r
712 public class XsdDateTime : XsdAnySimpleType
\r
714 internal XsdDateTime ()
\r
718 public override XmlTokenizedType TokenizedType {
\r
719 get { return XmlTokenizedType.CDATA; }
\r
722 public override Type ValueType {
\r
723 get { return typeof (DateTime); }
\r
726 public override object ParseValue (string s,
\r
727 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
729 return XmlConvert.ToDateTime (s);
\r
732 // Fundamental Facets
\r
733 public override bool Bounded {
\r
734 get { return false; }
\r
736 public override bool Finite {
\r
737 get { return true; }
\r
739 public override bool Numeric {
\r
740 get { return false; }
\r
742 public override XsdOrderedFacet Ordered {
\r
743 get { return XsdOrderedFacet.Total; }
\r
748 public class XsdDate : XsdDateTime
\r
750 public override object ParseValue (string s,
\r
751 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
753 return DateTime.ParseExact (s, "yyyy-MM-dd", null);
\r
758 public class XsdTime : XsdDateTime
\r
760 public override object ParseValue (string s,
\r
761 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
763 return DateTime.ParseExact (s, "HH:mm:ss.fffffffzzz", null);
\r