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
288 public override XmlTokenizedType TokenizedType {
\r
289 get { return XmlTokenizedType.ENTITY; }
\r
292 public override Type ValueType {
\r
293 get { return typeof (string); }
\r
296 // ParseValue () method is as same as that of xs:string
\r
301 public class XsdEntities : XsdName
\r
303 internal XsdEntities ()
\r
307 public override XmlTokenizedType TokenizedType {
\r
308 get { return XmlTokenizedType.ENTITIES; }
\r
311 public override Type ValueType {
\r
312 get { return typeof (string []); }
\r
315 readonly char [] whitespaceArray = new char [] {' '};
\r
316 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
318 return this.Normalize (value).Split (whitespaceArray);
\r
323 public class XsdNotation : XsdAnySimpleType
\r
325 internal XsdNotation ()
\r
329 public override XmlTokenizedType TokenizedType {
\r
330 get { return XmlTokenizedType.NOTATION; }
\r
333 public override Type ValueType {
\r
334 get { return typeof (string); }
\r
337 public override object ParseValue (string s,
\r
338 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
340 throw new NotImplementedException ();
\r
343 // Fundamental Facets
\r
344 public override bool Bounded {
\r
345 get { return false; }
\r
347 public override bool Finite {
\r
348 get { return false; }
\r
350 public override bool Numeric {
\r
351 get { return false; }
\r
353 public override XsdOrderedFacet Ordered {
\r
354 get { return XsdOrderedFacet.False; }
\r
357 // Constraining Facets
\r
358 public bool HasLengthFacet;
\r
359 public bool HasMaxLengthFacet;
\r
360 public bool HasMinLengthFacet;
\r
362 public int MaxLength;
\r
363 public int MinLength;
\r
364 public string Pattern;
\r
365 public ICollection Enumeration;
\r
369 public class XsdDecimal : XsdAnySimpleType
\r
371 internal XsdDecimal ()
\r
375 public override XmlTokenizedType TokenizedType {
\r
376 get { return XmlTokenizedType.CDATA; }
\r
379 public override Type ValueType {
\r
380 get { return typeof (decimal); }
\r
383 public override object ParseValue (string s,
\r
384 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
386 return XmlConvert.ToDecimal (this.Normalize (s));
\r
389 // Fundamental Facets
\r
390 public override bool Bounded {
\r
391 get { return false; }
\r
393 public override bool Finite {
\r
394 get { return false; }
\r
396 public override bool Numeric {
\r
397 get { return true; }
\r
399 public override XsdOrderedFacet Ordered {
\r
400 get { return XsdOrderedFacet.Total; }
\r
403 // Constraining Facets
\r
404 public bool HasLengthFacet;
\r
405 public bool HasMaxLengthFacet;
\r
406 public bool HasMinLengthFacet;
\r
408 public int MaxLength;
\r
409 public int MinLength;
\r
410 public string Pattern;
\r
411 public ICollection Enumeration;
\r
415 public class XsdInteger : XsdDecimal
\r
417 // Here it may be bigger than int's (or long's) MaxValue.
\r
418 public override Type ValueType {
\r
419 get { return typeof (decimal); }
\r
422 public override object ParseValue (string s,
\r
423 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
425 return XmlConvert.ToDecimal (Normalize (s));
\r
430 public class XsdLong : XsdNonNegativeInteger
\r
432 public override Type ValueType {
\r
433 get { return typeof (long); }
\r
436 public override object ParseValue (string s,
\r
437 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
439 return XmlConvert.ToInt64 (Normalize (s));
\r
444 public class XsdInt : XsdLong
\r
446 public override Type ValueType {
\r
447 get { return typeof (int); }
\r
450 public override object ParseValue (string s,
\r
451 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
453 return XmlConvert.ToInt32 (Normalize (s));
\r
459 public class XsdShort : XsdInt
\r
461 public override Type ValueType {
\r
462 get { return typeof (short); }
\r
465 public override object ParseValue (string s,
\r
466 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
468 return XmlConvert.ToInt16 (Normalize (s));
\r
473 public class XsdByte : XsdShort
\r
475 public override Type ValueType {
\r
476 get { return typeof (byte); }
\r
479 public override object ParseValue (string s,
\r
480 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
482 return XmlConvert.ToByte (Normalize (s));
\r
486 // xs:nonNegativeInteger
\r
487 [CLSCompliant (false)]
\r
488 public class XsdNonNegativeInteger : XsdInteger
\r
490 public override Type ValueType {
\r
491 get { return typeof (decimal); }
\r
494 [CLSCompliant (false)]
\r
495 public override object ParseValue (string s,
\r
496 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
498 return XmlConvert.ToDecimal (Normalize (s));
\r
503 [CLSCompliant (false)]
\r
504 public class XsdUnsignedLong : XsdNonNegativeInteger
\r
506 public override Type ValueType {
\r
507 get { return typeof (ulong); }
\r
510 public override object ParseValue (string s,
\r
511 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
513 return XmlConvert.ToUInt64 (Normalize (s));
\r
518 [CLSCompliant (false)]
\r
519 public class XsdUnsignedInt : XsdUnsignedLong
\r
521 public override Type ValueType {
\r
522 get { return typeof (uint); }
\r
525 public override object ParseValue (string s,
\r
526 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
528 return XmlConvert.ToUInt32 (Normalize (s));
\r
533 // xs:unsignedShort
\r
534 [CLSCompliant (false)]
\r
535 public class XsdUnsignedShort : XsdUnsignedInt
\r
537 public override Type ValueType {
\r
538 get { return typeof (ushort); }
\r
541 public override object ParseValue (string s,
\r
542 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
544 return XmlConvert.ToUInt16 (Normalize (s));
\r
549 [CLSCompliant (false)]
\r
550 public class XsdUnsignedByte : XsdUnsignedShort
\r
552 public override Type ValueType {
\r
553 get { return typeof (byte); }
\r
556 public override object ParseValue (string s,
\r
557 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
559 return XmlConvert.ToByte(Normalize (s));
\r
563 // xs:positiveInteger
\r
564 public class XsdPositiveInteger : XsdNonNegativeInteger
\r
566 // It returns decimal, instead of int or long.
\r
567 // Maybe MS developers thought about big integer...
\r
568 public override Type ValueType {
\r
569 get { return typeof (decimal); }
\r
572 public override object ParseValue (string s,
\r
573 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
575 return XmlConvert.ToDecimal (Normalize (s));
\r
579 // xs:nonPositiveInteger
\r
580 public class XsdNonPositiveInteger : XsdInteger
\r
582 public override Type ValueType {
\r
583 get { return typeof (decimal); }
\r
586 public override object ParseValue (string s,
\r
587 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
589 return XmlConvert.ToDecimal (Normalize (s));
\r
593 // xs:negativeInteger
\r
594 public class XsdNegativeInteger : XsdNonPositiveInteger
\r
596 public override Type ValueType {
\r
598 get { return typeof (decimal); }
\r
601 public override object ParseValue (string s,
\r
602 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
604 return XmlConvert.ToDecimal (Normalize (s));
\r
609 public class XsdFloat : XsdDecimal
\r
611 public override Type ValueType {
\r
612 get { return typeof (float); }
\r
615 public override object ParseValue (string s,
\r
616 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
618 return XmlConvert.ToSingle (Normalize (s));
\r
624 public class XsdBase64Binary : XsdString
\r
626 internal XsdBase64Binary ()
\r
630 public override Type ValueType {
\r
631 get { return typeof (byte[]); }
\r
634 public override object ParseValue (string s,
\r
635 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
637 return Convert.FromBase64String (s);
\r
642 public class XsdBoolean : XsdAnySimpleType
\r
644 internal XsdBoolean ()
\r
648 public override XmlTokenizedType TokenizedType {
\r
649 get { return XmlTokenizedType.CDATA; }
\r
652 public override Type ValueType {
\r
653 get { return typeof (bool); }
\r
656 public override object ParseValue (string s,
\r
657 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
659 return XmlConvert.ToBoolean (this.Normalize (s));
\r
662 // Fundamental Facets
\r
663 public override bool Bounded {
\r
664 get { return false; }
\r
666 public override bool Finite {
\r
667 get { return true; }
\r
669 public override bool Numeric {
\r
670 get { return false; }
\r
672 public override XsdOrderedFacet Ordered {
\r
673 get { return XsdOrderedFacet.Total; }
\r