2 // System.Xml.Schema.XmlSchemaDatatype.cs
\r
5 // Dwivedi, Ajay kumar <Adwiv@Yahoo.com>
\r
6 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
\r
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;
\r
33 using Mono.Xml.Schema;
\r
35 namespace System.Xml.Schema
\r
37 public abstract class XmlSchemaDatatype
\r
39 protected XmlSchemaDatatype()
\r
43 internal XsdWhitespaceFacet WhitespaceValue =
\r
44 XsdWhitespaceFacet.Preserve;
\r
47 internal virtual XsdWhitespaceFacet Whitespace {
\r
48 get { return WhitespaceValue; }
\r
52 public abstract XmlTypeCode TypeCode { get; }
\r
54 public virtual XmlSchemaDatatypeVariety Variety {
\r
56 return XmlSchemaDatatypeVariety.Atomic;
\r
61 public abstract XmlTokenizedType TokenizedType { get; }
\r
62 public abstract Type ValueType { get; }
\r
67 public virtual object ChangeType (object value, Type targetType)
\r
69 return ChangeType (value, targetType, null);
\r
73 public virtual object ChangeType (object value, Type targetType, IXmlNamespaceResolver nsResolver)
\r
75 throw new NotImplementedException ();
\r
79 public virtual bool IsDerivedFrom (XmlSchemaDatatype datatype)
\r
81 throw new NotImplementedException ();
\r
87 public virtual object ParseValue (object o,
\r
88 XmlNameTable nameTable, IXmlNamespaceResolver nsmgr)
\r
90 return ParseValue (o != null ? o.ToString () : null,
\r
94 public abstract object ParseValue (string s,
\r
95 XmlNameTable nameTable, IXmlNamespaceResolver nsmgr);
\r
97 internal abstract ValueType ParseValueType (string s,
\r
98 XmlNameTable nameTable, IXmlNamespaceResolver nsmgr);
\r
100 public abstract object ParseValue (string s,
\r
101 XmlNameTable nameTable, XmlNamespaceManager nsmgr);
\r
103 internal abstract ValueType ParseValueType (string s,
\r
104 XmlNameTable nameTable, XmlNamespaceManager nsmgr);
\r
107 static char [] wsChars = new char [] {' ', '\t', '\n', '\r'};
\r
109 StringBuilder sb = new StringBuilder ();
\r
110 internal string Normalize (string s)
\r
112 return Normalize (s, Whitespace);
\r
115 internal string Normalize (string s, XsdWhitespaceFacet whitespaceFacet)
\r
117 int idx = s.IndexOfAny (wsChars);
\r
120 switch (whitespaceFacet) {
\r
121 case XsdWhitespaceFacet.Collapse:
\r
122 string [] arr = s.Trim ().Split (wsChars);
\r
123 for (int i = 0; i < arr.Length; i++) {
\r
124 string one = arr [i];
\r
130 string result = sb.ToString ();
\r
132 return result.Trim ();
\r
133 case XsdWhitespaceFacet.Replace:
\r
136 for (int i = 0; i < sb.Length; i++)
\r
144 result = sb.ToString ();
\r
152 internal static XmlSchemaDatatype FromName (XmlQualifiedName qname)
\r
154 return FromName (qname.Name, qname.Namespace);
\r
157 internal static XmlSchemaDatatype FromName (string localName, string ns)
\r
160 case XmlSchema.Namespace:
\r
163 case XmlSchema.XdtNamespace:
\r
164 switch (localName) {
\r
165 case "anyAtomicType":
\r
166 return datatypeAnyAtomicType;
\r
167 case "untypedAtomic":
\r
168 return datatypeUntypedAtomic;
\r
169 case "dayTimeDuration":
\r
170 return datatypeDayTimeDuration;
\r
171 case "yearMonthDuration":
\r
172 return datatypeYearMonthDuration;
\r
177 // Maybe invalid name was specified. In such cases, let processors handle them.
\r
181 switch (localName) {
\r
182 case "anySimpleType":
\r
183 return datatypeAnySimpleType;
\r
185 return datatypeString;
\r
186 case "normalizedString":
\r
187 return datatypeNormalizedString;
\r
189 return datatypeToken;
\r
191 return datatypeLanguage;
\r
193 return datatypeNMToken;
\r
195 return datatypeNMTokens;
\r
197 return datatypeName;
\r
199 return datatypeNCName;
\r
203 return datatypeIDRef;
\r
205 return datatypeIDRefs;
\r
207 return datatypeEntity;
\r
209 return datatypeEntities;
\r
211 return datatypeNotation;
\r
213 return datatypeDecimal;
\r
215 return datatypeInteger;
\r
217 return datatypeLong;
\r
219 return datatypeInt;
\r
221 return datatypeShort;
\r
223 return datatypeByte;
\r
224 case "nonPositiveInteger":
\r
225 return datatypeNonPositiveInteger;
\r
226 case "negativeInteger":
\r
227 return datatypeNegativeInteger;
\r
228 case "nonNegativeInteger":
\r
229 return datatypeNonNegativeInteger;
\r
230 case "unsignedLong":
\r
231 return datatypeUnsignedLong;
\r
232 case "unsignedInt":
\r
233 return datatypeUnsignedInt;
\r
234 case "unsignedShort":
\r
235 return datatypeUnsignedShort;
\r
236 case "unsignedByte":
\r
237 return datatypeUnsignedByte;
\r
238 case "positiveInteger":
\r
239 return datatypePositiveInteger;
\r
241 return datatypeFloat;
\r
243 return datatypeDouble;
\r
244 case "base64Binary":
\r
245 return datatypeBase64Binary;
\r
247 return datatypeBoolean;
\r
249 return datatypeAnyURI;
\r
251 return datatypeDuration;
\r
253 return datatypeDateTime;
\r
255 return datatypeDate;
\r
257 return datatypeTime;
\r
259 return datatypeHexBinary;
\r
261 return datatypeQName;
\r
263 return datatypeGYearMonth;
\r
265 return datatypeGMonthDay;
\r
267 return datatypeGYear;
\r
269 return datatypeGMonth;
\r
271 return datatypeGDay;
\r
273 // Maybe invalid name was specified. In such cases, let processors handle them.
\r
278 static readonly XsdAnySimpleType datatypeAnySimpleType = new XsdAnySimpleType ();
\r
279 static readonly XsdString datatypeString = new XsdString ();
\r
280 static readonly XsdNormalizedString datatypeNormalizedString = new XsdNormalizedString ();
\r
281 static readonly XsdToken datatypeToken = new XsdToken ();
\r
282 static readonly XsdLanguage datatypeLanguage = new XsdLanguage ();
\r
283 static readonly XsdNMToken datatypeNMToken = new XsdNMToken ();
\r
284 static readonly XsdNMTokens datatypeNMTokens = new XsdNMTokens ();
\r
285 static readonly XsdName datatypeName = new XsdName ();
\r
286 static readonly XsdNCName datatypeNCName = new XsdNCName ();
\r
287 static readonly XsdID datatypeID = new XsdID ();
\r
288 static readonly XsdIDRef datatypeIDRef = new XsdIDRef ();
\r
289 static readonly XsdIDRefs datatypeIDRefs = new XsdIDRefs ();
\r
290 static readonly XsdEntity datatypeEntity = new XsdEntity ();
\r
291 static readonly XsdEntities datatypeEntities = new XsdEntities ();
\r
292 static readonly XsdNotation datatypeNotation = new XsdNotation ();
\r
293 static readonly XsdDecimal datatypeDecimal = new XsdDecimal ();
\r
294 static readonly XsdInteger datatypeInteger = new XsdInteger ();
\r
295 static readonly XsdLong datatypeLong = new XsdLong ();
\r
296 static readonly XsdInt datatypeInt = new XsdInt ();
\r
297 static readonly XsdShort datatypeShort = new XsdShort ();
\r
298 static readonly XsdByte datatypeByte = new XsdByte ();
\r
299 static readonly XsdNonNegativeInteger datatypeNonNegativeInteger = new XsdNonNegativeInteger ();
\r
300 static readonly XsdPositiveInteger datatypePositiveInteger = new XsdPositiveInteger ();
\r
301 static readonly XsdUnsignedLong datatypeUnsignedLong = new XsdUnsignedLong ();
\r
302 static readonly XsdUnsignedInt datatypeUnsignedInt = new XsdUnsignedInt ();
\r
303 static readonly XsdUnsignedShort datatypeUnsignedShort = new XsdUnsignedShort ();
\r
304 static readonly XsdUnsignedByte datatypeUnsignedByte = new XsdUnsignedByte ();
\r
305 static readonly XsdNonPositiveInteger datatypeNonPositiveInteger = new XsdNonPositiveInteger ();
\r
306 static readonly XsdNegativeInteger datatypeNegativeInteger = new XsdNegativeInteger ();
\r
307 static readonly XsdFloat datatypeFloat = new XsdFloat ();
\r
308 static readonly XsdDouble datatypeDouble = new XsdDouble ();
\r
309 static readonly XsdBase64Binary datatypeBase64Binary = new XsdBase64Binary ();
\r
310 static readonly XsdBoolean datatypeBoolean = new XsdBoolean ();
\r
311 static readonly XsdAnyURI datatypeAnyURI = new XsdAnyURI ();
\r
312 static readonly XsdDuration datatypeDuration = new XsdDuration ();
\r
313 static readonly XsdDateTime datatypeDateTime = new XsdDateTime ();
\r
314 static readonly XsdDate datatypeDate = new XsdDate ();
\r
315 static readonly XsdTime datatypeTime = new XsdTime ();
\r
316 static readonly XsdHexBinary datatypeHexBinary = new XsdHexBinary ();
\r
317 static readonly XsdQName datatypeQName = new XsdQName ();
\r
318 static readonly XsdGYearMonth datatypeGYearMonth = new XsdGYearMonth ();
\r
319 static readonly XsdGMonthDay datatypeGMonthDay = new XsdGMonthDay ();
\r
320 static readonly XsdGYear datatypeGYear = new XsdGYear ();
\r
321 static readonly XsdGMonth datatypeGMonth = new XsdGMonth ();
\r
322 static readonly XsdGDay datatypeGDay = new XsdGDay ();
\r
324 static readonly XdtAnyAtomicType datatypeAnyAtomicType
\r
325 = new XdtAnyAtomicType ();
\r
326 static readonly XdtUntypedAtomic datatypeUntypedAtomic
\r
327 = new XdtUntypedAtomic ();
\r
328 static readonly XdtDayTimeDuration datatypeDayTimeDuration
\r
329 = new XdtDayTimeDuration ();
\r
330 static readonly XdtYearMonthDuration datatypeYearMonthDuration
\r
331 = new XdtYearMonthDuration ();
\r