2 // System.Xml.Schema.XmlSchemaDatatype.cs
5 // Dwivedi, Ajay kumar <Adwiv@Yahoo.com>
6 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections;
33 using Mono.Xml.Schema;
35 namespace System.Xml.Schema
37 public abstract class XmlSchemaDatatype
39 protected XmlSchemaDatatype()
43 internal XsdWhitespaceFacet WhitespaceValue =
44 XsdWhitespaceFacet.Preserve;
47 internal virtual XsdWhitespaceFacet Whitespace {
48 get { return WhitespaceValue; }
52 public virtual XmlTypeCode TypeCode {
53 // Actually no way to verify default value, since
54 // in .NET 2.0 it cannot be derived externally anymore.
55 get { return XmlTypeCode.None; }
58 XmlValueConverter value_converter;
59 internal XmlValueConverter ValueConverter {
60 get { return (value_converter = value_converter ?? new XsdAnyTypeConverter (TypeCode)); }
63 public virtual XmlSchemaDatatypeVariety Variety {
65 return XmlSchemaDatatypeVariety.Atomic;
70 public abstract XmlTokenizedType TokenizedType { get; }
71 public abstract Type ValueType { get; }
76 public virtual object ChangeType (object value, Type targetType)
78 return ChangeType (value, targetType, null);
82 public virtual object ChangeType (object value, Type targetType, IXmlNamespaceResolver nsResolver)
84 throw new NotImplementedException ();
87 public virtual bool IsDerivedFrom (XmlSchemaDatatype datatype)
89 // It is documented to return always false, but
90 // actually returns true when the argument is for
91 // the same type (and it does not check null argument).
92 return this == datatype;
97 public abstract object ParseValue (string s,
98 XmlNameTable nameTable, IXmlNamespaceResolver nsmgr);
100 internal virtual ValueType ParseValueType (string s,
101 XmlNameTable nameTable, IXmlNamespaceResolver nsmgr)
106 public abstract object ParseValue (string s,
107 XmlNameTable nameTable, XmlNamespaceManager nsmgr);
109 internal virtual ValueType ParseValueType (string s,
110 XmlNameTable nameTable, XmlNamespaceManager nsmgr)
116 static char [] wsChars = new char [] {' ', '\t', '\n', '\r'};
118 StringBuilder sb = new StringBuilder ();
119 internal string Normalize (string s)
121 return Normalize (s, Whitespace);
124 internal string Normalize (string s, XsdWhitespaceFacet whitespaceFacet)
126 int idx = s.IndexOfAny (wsChars);
129 switch (whitespaceFacet) {
130 case XsdWhitespaceFacet.Collapse:
131 string [] arr = s.Trim ().Split (wsChars);
132 for (int i = 0; i < arr.Length; i++) {
133 string one = arr [i];
139 string result = sb.ToString ();
141 return result.Trim ();
142 case XsdWhitespaceFacet.Replace:
145 for (int i = 0; i < sb.Length; i++)
153 result = sb.ToString ();
161 internal static XmlSchemaDatatype FromName (XmlQualifiedName qname)
163 return FromName (qname.Name, qname.Namespace);
166 internal static XmlSchemaDatatype FromName (string localName, string ns)
169 case XmlSchema.Namespace:
172 case XmlSchema.XdtNamespace:
174 case "anyAtomicType":
175 return datatypeAnyAtomicType;
176 case "untypedAtomic":
177 return datatypeUntypedAtomic;
178 case "dayTimeDuration":
179 return datatypeDayTimeDuration;
180 case "yearMonthDuration":
181 return datatypeYearMonthDuration;
186 // Maybe invalid name was specified. In such cases, let processors handle them.
191 case "anySimpleType":
192 return datatypeAnySimpleType;
194 return datatypeString;
195 case "normalizedString":
196 return datatypeNormalizedString;
198 return datatypeToken;
200 return datatypeLanguage;
202 return datatypeNMToken;
204 return datatypeNMTokens;
208 return datatypeNCName;
212 return datatypeIDRef;
214 return datatypeIDRefs;
216 return datatypeEntity;
218 return datatypeEntities;
220 return datatypeNotation;
222 return datatypeDecimal;
224 return datatypeInteger;
230 return datatypeShort;
233 case "nonPositiveInteger":
234 return datatypeNonPositiveInteger;
235 case "negativeInteger":
236 return datatypeNegativeInteger;
237 case "nonNegativeInteger":
238 return datatypeNonNegativeInteger;
240 return datatypeUnsignedLong;
242 return datatypeUnsignedInt;
243 case "unsignedShort":
244 return datatypeUnsignedShort;
246 return datatypeUnsignedByte;
247 case "positiveInteger":
248 return datatypePositiveInteger;
250 return datatypeFloat;
252 return datatypeDouble;
254 return datatypeBase64Binary;
256 return datatypeBoolean;
258 return datatypeAnyURI;
260 return datatypeDuration;
262 return datatypeDateTime;
268 return datatypeHexBinary;
270 return datatypeQName;
272 return datatypeGYearMonth;
274 return datatypeGMonthDay;
276 return datatypeGYear;
278 return datatypeGMonth;
282 // Maybe invalid name was specified. In such cases, let processors handle them.
287 static readonly XsdAnySimpleType datatypeAnySimpleType =XsdAnySimpleType.Instance;
288 static readonly XsdString datatypeString = new XsdString ();
289 static readonly XsdNormalizedString datatypeNormalizedString = new XsdNormalizedString ();
290 static readonly XsdToken datatypeToken = new XsdToken ();
291 static readonly XsdLanguage datatypeLanguage = new XsdLanguage ();
292 static readonly XsdNMToken datatypeNMToken = new XsdNMToken ();
293 static readonly XsdNMTokens datatypeNMTokens = new XsdNMTokens ();
294 static readonly XsdName datatypeName = new XsdName ();
295 static readonly XsdNCName datatypeNCName = new XsdNCName ();
296 static readonly XsdID datatypeID = new XsdID ();
297 static readonly XsdIDRef datatypeIDRef = new XsdIDRef ();
298 static readonly XsdIDRefs datatypeIDRefs = new XsdIDRefs ();
299 static readonly XsdEntity datatypeEntity = new XsdEntity ();
300 static readonly XsdEntities datatypeEntities = new XsdEntities ();
301 static readonly XsdNotation datatypeNotation = new XsdNotation ();
302 static readonly XsdDecimal datatypeDecimal = new XsdDecimal ();
303 static readonly XsdInteger datatypeInteger = new XsdInteger ();
304 static readonly XsdLong datatypeLong = new XsdLong ();
305 static readonly XsdInt datatypeInt = new XsdInt ();
306 static readonly XsdShort datatypeShort = new XsdShort ();
307 static readonly XsdByte datatypeByte = new XsdByte ();
308 static readonly XsdNonNegativeInteger datatypeNonNegativeInteger = new XsdNonNegativeInteger ();
309 static readonly XsdPositiveInteger datatypePositiveInteger = new XsdPositiveInteger ();
310 static readonly XsdUnsignedLong datatypeUnsignedLong = new XsdUnsignedLong ();
311 static readonly XsdUnsignedInt datatypeUnsignedInt = new XsdUnsignedInt ();
312 static readonly XsdUnsignedShort datatypeUnsignedShort = new XsdUnsignedShort ();
313 static readonly XsdUnsignedByte datatypeUnsignedByte = new XsdUnsignedByte ();
314 static readonly XsdNonPositiveInteger datatypeNonPositiveInteger = new XsdNonPositiveInteger ();
315 static readonly XsdNegativeInteger datatypeNegativeInteger = new XsdNegativeInteger ();
316 static readonly XsdFloat datatypeFloat = new XsdFloat ();
317 static readonly XsdDouble datatypeDouble = new XsdDouble ();
318 static readonly XsdBase64Binary datatypeBase64Binary = new XsdBase64Binary ();
319 static readonly XsdBoolean datatypeBoolean = new XsdBoolean ();
320 static readonly XsdAnyURI datatypeAnyURI = new XsdAnyURI ();
321 static readonly XsdDuration datatypeDuration = new XsdDuration ();
322 static readonly XsdDateTime datatypeDateTime = new XsdDateTime ();
323 static readonly XsdDate datatypeDate = new XsdDate ();
324 static readonly XsdTime datatypeTime = new XsdTime ();
325 static readonly XsdHexBinary datatypeHexBinary = new XsdHexBinary ();
326 static readonly XsdQName datatypeQName = new XsdQName ();
327 static readonly XsdGYearMonth datatypeGYearMonth = new XsdGYearMonth ();
328 static readonly XsdGMonthDay datatypeGMonthDay = new XsdGMonthDay ();
329 static readonly XsdGYear datatypeGYear = new XsdGYear ();
330 static readonly XsdGMonth datatypeGMonth = new XsdGMonth ();
331 static readonly XsdGDay datatypeGDay = new XsdGDay ();
333 static readonly XdtAnyAtomicType datatypeAnyAtomicType
334 = new XdtAnyAtomicType ();
335 static readonly XdtUntypedAtomic datatypeUntypedAtomic
336 = new XdtUntypedAtomic ();
337 static readonly XdtDayTimeDuration datatypeDayTimeDuration
338 = new XdtDayTimeDuration ();
339 static readonly XdtYearMonthDuration datatypeYearMonthDuration
340 = new XdtYearMonthDuration ();