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
117 public override XmlTokenizedType TokenizedType {
\r
118 get { return XmlTokenizedType.CDATA; }
\r
121 public override Type ValueType {
\r
122 get { return typeof (string); }
\r
125 // ParseValue () method is as same as that of xs:string
\r
129 public class XsdLanguage : XsdToken
\r
131 internal XsdLanguage ()
\r
135 public override XmlTokenizedType TokenizedType {
\r
136 get { return XmlTokenizedType.CDATA; }
\r
139 public override Type ValueType {
\r
140 get { return typeof (string); }
\r
143 // ParseValue () method is as same as that of xs:string
\r
147 public class XsdNMToken : XsdToken
\r
149 internal XsdNMToken ()
\r
153 public override XmlTokenizedType TokenizedType {
\r
154 get { return XmlTokenizedType.NMTOKEN; }
\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 XsdNMTokens : XsdNMToken
\r
167 internal XsdNMTokens ()
\r
171 public override XmlTokenizedType TokenizedType {
\r
172 get { return XmlTokenizedType.NMTOKENS; }
\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 XsdName : XsdToken
\r
185 internal XsdName ()
\r
189 public override XmlTokenizedType TokenizedType {
\r
190 get { return XmlTokenizedType.CDATA; }
\r
193 public override Type ValueType {
\r
194 get { return typeof (string); }
\r
197 // ParseValue () method is as same as that of xs:string
\r
201 public class XsdNCName : XsdName
\r
203 internal XsdNCName ()
\r
207 public override XmlTokenizedType TokenizedType {
\r
208 get { return XmlTokenizedType.NCName; }
\r
211 public override Type ValueType {
\r
212 get { return typeof (string); }
\r
215 // ParseValue () method is as same as that of xs:string
\r
219 public class XsdID : XsdName
\r
225 public override XmlTokenizedType TokenizedType {
\r
226 get { return XmlTokenizedType.ID; }
\r
229 public override Type ValueType {
\r
230 get { return typeof (string); }
\r
233 // ParseValue () method is as same as that of xs:string
\r
237 public class XsdIDRef : XsdName
\r
239 internal XsdIDRef ()
\r
243 public override XmlTokenizedType TokenizedType {
\r
244 get { return XmlTokenizedType.IDREF; }
\r
247 public override Type ValueType {
\r
248 get { return typeof (string); }
\r
251 // ParseValue () method is as same as that of xs:string
\r
255 public class XsdIDRefs : XsdName
\r
257 internal XsdIDRefs ()
\r
261 public override XmlTokenizedType TokenizedType {
\r
262 get { return XmlTokenizedType.IDREFS; }
\r
265 public override Type ValueType {
\r
266 get { return typeof (string []); }
\r
269 readonly char [] whitespaceArray = new char [] {' '};
\r
270 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)
\r
272 return this.Normalize (value).Split (whitespaceArray);
\r
277 public class XsdEntity : XsdName
\r
279 internal XsdEntity ()
\r
283 public override XmlTokenizedType TokenizedType {
\r
284 get { return XmlTokenizedType.ENTITY; }
\r
287 public override Type ValueType {
\r
288 get { return typeof (string); }
\r
291 // ParseValue () method is as same as that of xs:string
\r
296 public class XsdEntities : XsdName
\r
298 internal XsdEntities ()
\r
302 public override XmlTokenizedType TokenizedType {
\r
303 get { return XmlTokenizedType.ENTITIES; }
\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 XsdNotation : XsdAnySimpleType
\r
316 internal XsdNotation ()
\r
320 public override XmlTokenizedType TokenizedType {
\r
321 get { return XmlTokenizedType.NOTATION; }
\r
324 public override Type ValueType {
\r
325 get { return typeof (string); }
\r
328 public override object ParseValue (string s,
\r
329 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
331 throw new NotImplementedException ();
\r
334 // Fundamental Facets
\r
335 public override bool Bounded {
\r
336 get { return false; }
\r
338 public override bool Finite {
\r
339 get { return false; }
\r
341 public override bool Numeric {
\r
342 get { return false; }
\r
344 public override XsdOrderedFacet Ordered {
\r
345 get { return XsdOrderedFacet.False; }
\r
348 // Constraining Facets
\r
349 public bool HasLengthFacet;
\r
350 public bool HasMaxLengthFacet;
\r
351 public bool HasMinLengthFacet;
\r
353 public int MaxLength;
\r
354 public int MinLength;
\r
355 public string Pattern;
\r
356 public ICollection Enumeration;
\r
360 public class XsdDecimal : XsdAnySimpleType
\r
362 internal XsdDecimal ()
\r
366 public override XmlTokenizedType TokenizedType {
\r
367 get { return XmlTokenizedType.CDATA; }
\r
370 public override Type ValueType {
\r
371 get { return typeof (decimal); }
\r
374 public override object ParseValue (string s,
\r
375 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
377 return XmlConvert.ToDecimal (this.Normalize (s));
\r
380 // Fundamental Facets
\r
381 public override bool Bounded {
\r
382 get { return false; }
\r
384 public override bool Finite {
\r
385 get { return false; }
\r
387 public override bool Numeric {
\r
388 get { return true; }
\r
390 public override XsdOrderedFacet Ordered {
\r
391 get { return XsdOrderedFacet.Total; }
\r
394 // Constraining Facets
\r
395 public bool HasLengthFacet;
\r
396 public bool HasMaxLengthFacet;
\r
397 public bool HasMinLengthFacet;
\r
399 public int MaxLength;
\r
400 public int MinLength;
\r
401 public string Pattern;
\r
402 public ICollection Enumeration;
\r
406 public class XsdInteger : XsdDecimal
\r
408 // Here it may be bigger than int's (or long's) MaxValue.
\r
409 public override Type ValueType {
\r
410 get { return typeof (decimal); }
\r
413 public override object ParseValue (string s,
\r
414 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
416 return XmlConvert.ToDecimal (Normalize (s));
\r
421 public class XsdLong : XsdNonNegativeInteger
\r
423 public override Type ValueType {
\r
424 get { return typeof (long); }
\r
427 public override object ParseValue (string s,
\r
428 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
430 return XmlConvert.ToInt64 (Normalize (s));
\r
435 public class XsdInt : XsdLong
\r
437 public override Type ValueType {
\r
438 get { return typeof (int); }
\r
441 public override object ParseValue (string s,
\r
442 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
444 return XmlConvert.ToInt32 (Normalize (s));
\r
450 public class XsdShort : XsdInt
\r
452 public override Type ValueType {
\r
453 get { return typeof (short); }
\r
456 public override object ParseValue (string s,
\r
457 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
459 return XmlConvert.ToInt16 (Normalize (s));
\r
464 public class XsdByte : XsdShort
\r
466 public override Type ValueType {
\r
467 get { return typeof (byte); }
\r
470 public override object ParseValue (string s,
\r
471 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
473 return XmlConvert.ToByte (Normalize (s));
\r
477 // xs:nonNegativeInteger
\r
478 [CLSCompliant (false)]
\r
479 public class XsdNonNegativeInteger : XsdInteger
\r
481 public override Type ValueType {
\r
482 get { return typeof (decimal); }
\r
485 [CLSCompliant (false)]
\r
486 public override object ParseValue (string s,
\r
487 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
489 return XmlConvert.ToDecimal (Normalize (s));
\r
494 [CLSCompliant (false)]
\r
495 public class XsdUnsignedLong : XsdNonNegativeInteger
\r
497 public override Type ValueType {
\r
498 get { return typeof (ulong); }
\r
501 public override object ParseValue (string s,
\r
502 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
504 return XmlConvert.ToUInt64 (Normalize (s));
\r
509 [CLSCompliant (false)]
\r
510 public class XsdUnsignedInt : XsdUnsignedLong
\r
512 public override Type ValueType {
\r
513 get { return typeof (uint); }
\r
516 public override object ParseValue (string s,
\r
517 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
519 return XmlConvert.ToUInt32 (Normalize (s));
\r
524 // xs:unsignedShort
\r
525 [CLSCompliant (false)]
\r
526 public class XsdUnsignedShort : XsdUnsignedInt
\r
528 public override Type ValueType {
\r
529 get { return typeof (ushort); }
\r
532 public override object ParseValue (string s,
\r
533 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
535 return XmlConvert.ToUInt16 (Normalize (s));
\r
540 [CLSCompliant (false)]
\r
541 public class XsdUnsignedByte : XsdUnsignedShort
\r
543 public override Type ValueType {
\r
544 get { return typeof (byte); }
\r
547 public override object ParseValue (string s,
\r
548 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
550 return XmlConvert.ToByte(Normalize (s));
\r
554 // xs:positiveInteger
\r
555 public class XsdPositiveInteger : XsdNonNegativeInteger
\r
557 // It returns decimal, instead of int or long.
\r
558 // Maybe MS developers thought about big integer...
\r
559 public override Type ValueType {
\r
560 get { return typeof (decimal); }
\r
563 public override object ParseValue (string s,
\r
564 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
566 return XmlConvert.ToDecimal (Normalize (s));
\r
570 // xs:nonPositiveInteger
\r
571 public class XsdNonPositiveInteger : XsdInteger
\r
573 public override Type ValueType {
\r
574 get { return typeof (decimal); }
\r
577 public override object ParseValue (string s,
\r
578 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
580 return XmlConvert.ToDecimal (Normalize (s));
\r
584 // xs:negativeInteger
\r
585 public class XsdNegativeInteger : XsdNonPositiveInteger
\r
587 public override Type ValueType {
\r
589 get { return typeof (decimal); }
\r
592 public override object ParseValue (string s,
\r
593 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
595 return XmlConvert.ToDecimal (Normalize (s));
\r
600 public class XsdFloat : XsdDecimal
\r
602 public override Type ValueType {
\r
603 get { return typeof (float); }
\r
606 public override object ParseValue (string s,
\r
607 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
609 return XmlConvert.ToSingle (Normalize (s));
\r
615 public class XsdBase64Binary : XsdString
\r
617 internal XsdBase64Binary ()
\r
621 public override Type ValueType {
\r
622 get { return typeof (byte[]); }
\r
625 public override object ParseValue (string s,
\r
626 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
628 return Convert.FromBase64String (s);
\r
633 public class XsdBoolean : XsdAnySimpleType
\r
635 internal XsdBoolean ()
\r
639 public override XmlTokenizedType TokenizedType {
\r
640 get { return XmlTokenizedType.CDATA; }
\r
643 public override Type ValueType {
\r
644 get { return typeof (bool); }
\r
647 public override object ParseValue (string s,
\r
648 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
\r
650 return XmlConvert.ToBoolean (this.Normalize (s));
\r
653 // Fundamental Facets
\r
654 public override bool Bounded {
\r
655 get { return false; }
\r
657 public override bool Finite {
\r
658 get { return true; }
\r
660 public override bool Numeric {
\r
661 get { return false; }
\r
663 public override XsdOrderedFacet Ordered {
\r
664 get { return XsdOrderedFacet.Total; }
\r