2 // XmlSchemaWriter.cs - DataSet.WriteXmlSchema() support
6 // Atsushi Enomoto <atsushi@ximian.com>
8 // Original WriteXml/WriteXmlSchema authors are:
9 // Ville Palo, Alan Tam, Lluis Sanchez and Eran Domb.
13 // Copyright (C) 2004-05 Novell, Inc (http://www.novell.com)
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 using System.Collections;
37 using System.Collections.Specialized;
38 using System.Globalization;
44 internal class XmlSchemaWriter
46 const string xmlnsxs = System.Xml.Schema.XmlSchema.Namespace;
48 public static void WriteXmlSchema (DataSet dataset,
51 WriteXmlSchema (dataset, writer, dataset.Tables,
55 public static void WriteXmlSchema (DataSet dataset,
56 XmlWriter writer, DataTableCollection tables,
57 DataRelationCollection relations)
59 new XmlSchemaWriter (dataset, writer,
60 tables, relations).WriteSchema ();
63 public XmlSchemaWriter (DataSet dataset,
64 XmlWriter writer, DataTableCollection tables,
65 DataRelationCollection relations)
70 this.relations = relations;
75 DataTableCollection tables;
76 DataRelationCollection relations;
78 ArrayList globalTypeTables = new ArrayList ();
79 Hashtable additionalNamespaces = new Hashtable ();
81 ArrayList annotation = new ArrayList ();
83 public string ConstraintPrefix {
84 get { return ds.Namespace != String.Empty ? XmlConstants.TnsPrefix + ':' : String.Empty; }
89 public void WriteSchema ()
91 ListDictionary names = new ListDictionary ();
92 ListDictionary includes = new ListDictionary ();
94 // Add namespaces used in DataSet components (tables, columns, ...)
95 foreach (DataTable dt in tables) {
96 foreach (DataColumn col in dt.Columns)
97 CheckNamespace (col.Prefix, col.Namespace, names, includes);
98 CheckNamespace (dt.Prefix, dt.Namespace, names, includes);
101 w.WriteStartElement ("xs", "schema", xmlnsxs);
102 w.WriteAttributeString ("id", XmlConvert.EncodeLocalName (ds.DataSetName));
104 if (ds.Namespace != String.Empty) {
105 w.WriteAttributeString ("targetNamespace",
107 w.WriteAttributeString (
109 XmlConstants.TnsPrefix,
110 XmlConstants.XmlnsNS,
113 w.WriteAttributeString ("xmlns", ds.Namespace);
115 w.WriteAttributeString ("xmlns", "xs",
116 XmlConstants.XmlnsNS, xmlnsxs);
117 w.WriteAttributeString ("xmlns",
118 XmlConstants.MsdataPrefix,
119 XmlConstants.XmlnsNS,
120 XmlConstants.MsdataNamespace);
122 if (CheckExtendedPropertyExists (tables, relations))
123 w.WriteAttributeString ("xmlns",
124 XmlConstants.MspropPrefix,
125 XmlConstants.XmlnsNS,
126 XmlConstants.MspropNamespace);
128 if (ds.Namespace != String.Empty) {
129 w.WriteAttributeString ("attributeFormDefault", "qualified");
130 w.WriteAttributeString ("elementFormDefault", "qualified");
133 foreach (string prefix in names.Keys)
134 w.WriteAttributeString ("xmlns", prefix,
135 XmlConstants.XmlnsNS,
136 names [prefix] as string);
138 if (includes.Count > 0)
139 w.WriteComment ("ATTENTION: This schema contains references to other imported schemas");
140 foreach (string ns in includes.Keys) {
141 w.WriteStartElement ("xs", "import", xmlnsxs);
142 w.WriteAttributeString ("namespace", ns);
143 w.WriteAttributeString ("schemaLocation", includes [ns] as string);
144 w.WriteEndElement ();
147 WriteDataSetElement ();
149 w.WriteEndElement (); // xs:schema
154 // FIXME: actually there are some cases that this method(ology)
156 private void WriteDataSetElement ()
158 w.WriteStartElement ("xs", "element", xmlnsxs);
159 w.WriteAttributeString ("name", XmlConvert.EncodeLocalName (ds.DataSetName));
160 w.WriteAttributeString (XmlConstants.MsdataPrefix,
161 "IsDataSet", XmlConstants.MsdataNamespace,
164 if (ds.Locale == CultureInfo.CurrentCulture) {
165 w.WriteAttributeString (
166 XmlConstants.MsdataPrefix,
168 XmlConstants.MsdataNamespace,
174 w.WriteAttributeString (
175 XmlConstants.MsdataPrefix,
177 XmlConstants.MsdataNamespace,
181 AddExtendedPropertyAttributes (ds.ExtendedProperties);
183 w.WriteStartElement ("xs", "complexType", xmlnsxs);
184 w.WriteStartElement ("xs", "choice", xmlnsxs);
185 w.WriteAttributeString ("maxOccurs", "unbounded");
187 foreach (DataTable table in tables) {
188 bool isTopLevel = true;
189 foreach (DataRelation rel in table.ParentRelations) {
197 if (ds.Namespace != table.Namespace) {
198 // <xs:element ref="X:y" />
199 w.WriteStartElement ("xs",
202 w.WriteStartAttribute ("ref", String.Empty);
203 w.WriteQualifiedName (XmlConvert.EncodeLocalName (table.TableName), table.Namespace);
204 w.WriteEndAttribute ();
205 w.WriteEndElement ();
208 WriteTableElement (table);
212 w.WriteEndElement (); // choice
213 w.WriteEndElement (); // complexType
215 WriteConstraints (); // DataSet constraints
217 w.WriteEndElement (); // element
219 if (annotation.Count > 0) {
220 w.WriteStartElement ("xs", "annotation", xmlnsxs);
221 w.WriteStartElement ("xs", "appinfo", xmlnsxs);
223 foreach (object o in annotation) {
224 if (!(o is DataRelation))
226 WriteDataRelationAnnotation ((DataRelation)o);
228 w.WriteEndElement ();
229 w.WriteEndElement ();
233 private void WriteDataRelationAnnotation (DataRelation rel)
235 String colnames = String.Empty;
236 w.WriteStartElement (XmlConstants.MsdataPrefix, "Relationship",
237 XmlConstants.MsdataNamespace);
239 w.WriteAttributeString ("name", XmlConvert.EncodeName (rel.RelationName));
241 w.WriteAttributeString (
242 XmlConstants.MsdataPrefix,
244 XmlConstants.MsdataNamespace,
245 XmlConvert.EncodeLocalName (rel.ParentTable.TableName));
247 w.WriteAttributeString (
248 XmlConstants.MsdataPrefix,
250 XmlConstants.MsdataNamespace,
251 XmlConvert.EncodeLocalName (rel.ChildTable.TableName));
253 colnames = String.Empty;
254 foreach (DataColumn col in rel.ParentColumns)
255 colnames += XmlConvert.EncodeLocalName (col.ColumnName) + " ";
256 w.WriteAttributeString (
257 XmlConstants.MsdataPrefix,
259 XmlConstants.MsdataNamespace,
260 colnames.TrimEnd ());
262 colnames = String.Empty;
263 foreach (DataColumn col in rel.ChildColumns)
264 colnames += XmlConvert.EncodeLocalName (col.ColumnName) + " ";
265 w.WriteAttributeString (
266 XmlConstants.MsdataPrefix,
268 XmlConstants.MsdataNamespace,
269 colnames.TrimEnd ());
271 w.WriteEndElement ();
274 private void WriteConstraints ()
276 ArrayList names = new ArrayList ();
278 // add all unique constraints.
279 foreach (DataTable table in tables) {
280 foreach (Constraint c in table.Constraints) {
282 c as UniqueConstraint;
284 AddUniqueConstraints (u, names);
288 ForeignKeyConstraint fk = c as ForeignKeyConstraint;
289 if (fk != null && (relations == null || !(relations.Contains (fk.ConstraintName)))) {
290 DataRelation rel = new DataRelation (fk.ConstraintName,
291 fk.RelatedColumns, fk.Columns);
292 AddForeignKeys (rel, names, true);
298 // Add all foriegn key constraints.
299 if (relations != null)
300 foreach (DataRelation rel in relations) {
301 if (rel.ParentKeyConstraint == null || rel.ChildKeyConstraint == null) {
302 annotation.Add (rel);
305 AddForeignKeys (rel, names,false);
309 // Add unique constaraints to the schema.
310 // return hashtable with the names of all XmlSchemaUnique elements we created.
311 private void AddUniqueConstraints (UniqueConstraint uniq,
314 // if column of the constraint is hidden do not write the constraint.
315 foreach (DataColumn column in uniq.Columns)
316 if (column.ColumnMapping == MappingType.Hidden)
317 return; // do nothing
319 w.WriteStartElement ("xs", "unique", xmlnsxs);
320 // if constaraint name do not exist in the hashtable we can use it.
322 if (!names.Contains (uniq.ConstraintName)) {
323 name = uniq.ConstraintName;
324 w.WriteAttributeString ("name", XmlConvert.EncodeName (name));
326 // otherwise generate new constraint name for the
327 // XmlSchemaUnique element.
329 name = XmlConvert.EncodeLocalName (uniq.Table.TableName) + "_" + uniq.ConstraintName;
330 w.WriteAttributeString ("name", name);
331 w.WriteAttributeString (
332 XmlConstants.MsdataPrefix,
333 XmlConstants.ConstraintName,
334 XmlConstants.MsdataNamespace,
335 uniq.ConstraintName);
339 if (uniq.IsPrimaryKey) {
340 w.WriteAttributeString (
341 XmlConstants.MsdataPrefix,
342 XmlConstants.PrimaryKey,
343 XmlConstants.MsdataNamespace,
347 AddExtendedPropertyAttributes (uniq.ExtendedProperties);
349 w.WriteStartElement ("xs", "selector",
351 w.WriteAttributeString ("xpath", ".//" +
352 ConstraintPrefix + XmlConvert.EncodeLocalName (uniq.Table.TableName));
353 w.WriteEndElement (); // selector
354 foreach (DataColumn c in uniq.Columns) {
355 w.WriteStartElement ("xs", "field",
357 w.WriteStartAttribute ("xpath", String.Empty);
358 if (c.ColumnMapping == MappingType.Attribute)
360 w.WriteString (ConstraintPrefix);
361 w.WriteString (XmlConvert.EncodeLocalName (c.ColumnName));
362 w.WriteEndAttribute (); // xpath
363 w.WriteEndElement (); // field
366 w.WriteEndElement (); // unique
369 // Add the foriegn keys to the schema.
370 private void AddForeignKeys (DataRelation rel, ArrayList names, bool isConstraintOnly)
372 // Do nothing if it contains hidden relation
373 foreach (DataColumn col in rel.ParentColumns)
374 if (col.ColumnMapping == MappingType.Hidden)
376 foreach (DataColumn col in rel.ChildColumns)
377 if (col.ColumnMapping == MappingType.Hidden)
380 w.WriteStartElement ("xs", "keyref", xmlnsxs);
381 w.WriteAttributeString ("name", XmlConvert.EncodeLocalName (rel.RelationName));
383 //ForeignKeyConstraint fkConst = rel.ChildKeyConstraint;
384 UniqueConstraint uqConst = null;
386 if (isConstraintOnly) {
387 foreach (Constraint c in rel.ParentTable.Constraints) {
388 uqConst = c as UniqueConstraint;
391 if (uqConst.Columns == rel.ParentColumns)
396 uqConst = rel.ParentKeyConstraint;
398 string concatName = XmlConvert.EncodeLocalName (rel.ParentTable.TableName) + "_" + uqConst.ConstraintName;
399 // first try to find the concatenated name. If we didn't find it - use constraint name.
400 if (names.Contains (concatName)) {
401 w.WriteStartAttribute ("refer", String.Empty);
402 w.WriteQualifiedName (concatName, ds.Namespace);
403 w.WriteEndAttribute ();
406 w.WriteStartAttribute ("refer", String.Empty);
407 w.WriteQualifiedName (
408 uqConst.ConstraintName, ds.Namespace);
409 w.WriteEndAttribute ();
412 if (isConstraintOnly)
413 w.WriteAttributeString ( XmlConstants.MsdataPrefix,
414 XmlConstants.ConstraintOnly,
415 XmlConstants.MsdataNamespace,
418 w.WriteAttributeString (
419 XmlConstants.MsdataPrefix,
420 XmlConstants.IsNested,
421 XmlConstants.MsdataNamespace,
424 AddExtendedPropertyAttributes (uqConst.ExtendedProperties);
426 w.WriteStartElement ("xs", "selector", xmlnsxs);
427 w.WriteAttributeString ("xpath", ".//" +
428 ConstraintPrefix + XmlConvert.EncodeLocalName (rel.ChildTable.TableName));
429 w.WriteEndElement ();
431 foreach (DataColumn c in rel.ChildColumns) {
432 w.WriteStartElement ("xs", "field",
434 w.WriteStartAttribute ("xpath", String.Empty);
435 if (c.ColumnMapping == MappingType.Attribute)
437 w.WriteString (ConstraintPrefix);
438 w.WriteString (XmlConvert.EncodeLocalName (c.ColumnName));
439 w.WriteEndAttribute ();
440 w.WriteEndElement (); // field
443 w.WriteEndElement (); // keyref
446 // ExtendedProperties
448 private bool CheckExtendedPropertyExists (
449 DataTableCollection tables,
450 DataRelationCollection relations)
452 if (ds.ExtendedProperties.Count > 0)
454 foreach (DataTable dt in tables) {
455 if (dt.ExtendedProperties.Count > 0)
457 foreach (DataColumn col in dt.Columns)
458 if (col.ExtendedProperties.Count > 0)
460 foreach (Constraint c in dt.Constraints)
461 if (c.ExtendedProperties.Count > 0)
464 if (relations == null)
466 foreach (DataRelation rel in relations)
467 if (rel.ExtendedProperties.Count > 0)
472 private void AddExtendedPropertyAttributes (PropertyCollection props)
474 // add extended properties to xs:element
475 foreach (DictionaryEntry de in props) {
476 w.WriteStartAttribute (
477 XmlConstants.MspropPrefix,
478 XmlConvert.EncodeName (de.Key.ToString ()),
479 XmlConstants.MspropNamespace);
480 if (de.Value != null)
482 DataSet.WriteObjectXml (de.Value));
483 w.WriteEndAttribute ();
489 private void WriteTableElement (DataTable table)
491 w.WriteStartElement ("xs", "element", xmlnsxs);
492 w.WriteAttributeString ("name", XmlConvert.EncodeLocalName (table.TableName));
494 AddExtendedPropertyAttributes (table.ExtendedProperties);
496 WriteTableType (table);
498 w.WriteEndElement ();
501 private void WriteTableType (DataTable table)
507 DataSet.SplitColumns (table, out atts, out elements, out simple);
509 w.WriteStartElement ("xs", "complexType", xmlnsxs);
511 if (simple != null) {
512 w.WriteStartElement ("xs", "simpleContent", xmlnsxs);
513 // add column name attribute
514 w.WriteAttributeString (
515 XmlConstants.MsdataPrefix,
516 XmlConvert.EncodeLocalName (XmlConstants.ColumnName),
517 XmlConstants.MsdataNamespace,
518 XmlConvert.EncodeLocalName (simple.ColumnName));
520 // add ordinal attribute
521 w.WriteAttributeString (
522 XmlConstants.MsdataPrefix,
523 XmlConstants.Ordinal,
524 XmlConstants.MsdataNamespace,
525 XmlConvert.ToString (simple.Ordinal));
528 w.WriteStartElement ("xs", "extension",
530 w.WriteStartAttribute ("base", String.Empty);
531 WriteQName (MapType (simple.DataType));
532 w.WriteEndAttribute ();
534 WriteTableAttributes (atts);
536 w.WriteEndElement ();
538 WriteTableAttributes (atts);
540 if (elements.Count > 0) {
541 w.WriteStartElement ("xs", "sequence",
543 foreach (DataColumn col in elements)
544 WriteTableTypeParticles (
546 w.WriteEndElement ();
549 foreach (DataRelation rel in table.ChildRelations)
551 WriteChildRelations (rel);
554 w.WriteFullEndElement (); // complexType
557 private void WriteTableTypeParticles (DataColumn col)
559 w.WriteStartElement ("xs", "element",
561 w.WriteAttributeString ("name",
562 XmlConvert.EncodeLocalName (col.ColumnName));
564 if (col.ColumnName != col.Caption && col.Caption != String.Empty)
565 w.WriteAttributeString (
566 XmlConstants.MsdataPrefix,
567 XmlConstants.Caption,
568 XmlConstants.MsdataNamespace,
571 if (col.AutoIncrement == true)
572 w.WriteAttributeString (
573 XmlConstants.MsdataPrefix,
574 XmlConstants.AutoIncrement,
575 XmlConstants.MsdataNamespace,
578 if (col.AutoIncrementSeed != 0) {
579 w.WriteAttributeString (
581 XmlConstants.MsdataPrefix,
582 XmlConstants.AutoIncrementSeed,
583 XmlConstants.MsdataNamespace,
584 XmlConvert.ToString (col.AutoIncrementSeed));
587 if (col.AutoIncrementStep != 1) {
588 w.WriteAttributeString (
590 XmlConstants.MsdataPrefix,
591 XmlConstants.AutoIncrementStep,
592 XmlConstants.MsdataNamespace,
593 XmlConvert.ToString (col.AutoIncrementStep));
596 if (col.DefaultValue.ToString () != String.Empty)
597 w.WriteAttributeString ("default",
598 DataSet.WriteObjectXml (col.DefaultValue));
601 w.WriteAttributeString (
602 XmlConstants.MsdataPrefix,
603 XmlConstants.ReadOnly,
604 XmlConstants.MsdataNamespace,
607 XmlQualifiedName typeQName = null;
608 if (col.MaxLength < 0) {
609 w.WriteStartAttribute ("type", String.Empty);
610 typeQName = MapType (col.DataType);
611 WriteQName (typeQName);
612 w.WriteEndAttribute ();
615 if (typeQName == XmlConstants.QnString
616 && col.DataType != typeof (string)
617 && col.DataType != typeof (char)) {
618 w.WriteStartAttribute (
619 XmlConstants.MsdataPrefix,
620 XmlConstants.DataType,
621 XmlConstants.MsdataNamespace);
622 string runtimeName = col.DataType.AssemblyQualifiedName;
623 w.WriteString (runtimeName);
624 w.WriteEndAttribute ();
628 w.WriteAttributeString ("minOccurs", "0");
630 //writer.WriteAttributeString (XmlConstants.MsdataPrefix,
631 // XmlConstants.Ordinal,
632 // XmlConstants.MsdataNamespace,
633 // col.Ordinal.ToString ());
635 // Write SimpleType if column have MaxLength
636 if (col.MaxLength > -1)
637 WriteSimpleType (col);
639 AddExtendedPropertyAttributes (col.ExtendedProperties);
641 w.WriteEndElement (); // sequence
644 private void WriteChildRelations (DataRelation rel)
646 if (rel.ChildTable.Namespace != ds.Namespace) {
647 w.WriteStartElement ("xs", "element", xmlnsxs);
648 w.WriteStartAttribute ("ref", String.Empty);
649 w.WriteQualifiedName (
650 XmlConvert.EncodeLocalName (rel.ChildTable.TableName),
651 rel.ChildTable.Namespace);
652 w.WriteEndAttribute ();
654 w.WriteStartElement ("xs", "element", xmlnsxs);
655 w.WriteStartAttribute ("type", String.Empty);
656 w.WriteQualifiedName (
657 XmlConvert.EncodeLocalName (rel.ChildTable.TableName),
658 rel.ChildTable.Namespace);
659 w.WriteEndAttribute ();
660 w.WriteEndElement ();
662 globalTypeTables.Add (rel.ChildTable);
663 w.WriteAttributeString ("minOccurs", "0");
664 w.WriteAttributeString ("maxOccurs", "unbounded");
668 private void WriteTableAttributes (ArrayList atts)
670 //Then a list of attributes
671 foreach (DataColumn col in atts) {
672 w.WriteStartElement ("xs", "attribute", xmlnsxs);
674 string name = XmlConvert.EncodeLocalName (col.ColumnName);
675 if (col.Namespace != String.Empty) {
676 w.WriteAttributeString ("form", "qualified");
677 string prefix = col.Prefix == String.Empty ? "app" + additionalNamespaces.Count : col.Prefix;
678 name = prefix + ":" + name;
679 // FIXME: Handle prefix mapping correctly.
680 additionalNamespaces [prefix] = col.Namespace;
682 w.WriteAttributeString ("name", name);
684 AddExtendedPropertyAttributes (
685 col.ExtendedProperties);
688 w.WriteAttributeString (
689 XmlConstants.MsdataPrefix,
690 XmlConstants.ReadOnly,
691 XmlConstants.MsdataNamespace,
694 if (col.MaxLength < 0) {
695 // otherwise simpleType is written later
696 w.WriteStartAttribute ("type", String.Empty);
697 WriteQName (MapType (col.DataType));
698 w.WriteEndAttribute ();
701 if (!col.AllowDBNull)
702 w.WriteAttributeString ("use", "required");
703 if (col.DefaultValue.ToString () != String.Empty)
704 w.WriteAttributeString ("default",
705 DataSet.WriteObjectXml (col.DefaultValue));
707 if (col.MaxLength > -1)
708 WriteSimpleType (col);
710 w.WriteEndElement (); // attribute
714 private void WriteSimpleType (DataColumn col)
716 w.WriteStartElement ("xs", "simpleType", xmlnsxs);
717 w.WriteStartElement ("xs", "restriction", xmlnsxs);
718 w.WriteStartAttribute ("base", String.Empty);
719 WriteQName (MapType (col.DataType));
720 w.WriteEndAttribute ();
722 w.WriteStartElement ("xs", "maxLength", xmlnsxs);
723 w.WriteAttributeString ("value",
724 XmlConvert.ToString (col.MaxLength));
725 w.WriteEndElement (); // maxLength
726 w.WriteEndElement (); // restriction
727 w.WriteEndElement (); // simpleType
730 private void WriteQName (XmlQualifiedName name)
732 w.WriteQualifiedName (name.Name, name.Namespace);
735 private void CheckNamespace (string prefix, string ns, ListDictionary names, ListDictionary includes)
737 if (ns == String.Empty)
739 if (ds.Namespace != ns) {
740 if (names [prefix] != ns) {
741 for (int i = 1; i < int.MaxValue; i++) {
742 string p = "app" + i;
743 if (names [p] == null) {
745 HandleExternalNamespace (p, ns, includes);
753 private void HandleExternalNamespace (string prefix, string ns, ListDictionary includes)
755 if (includes.Contains (ns))
756 return; // nothing to do
757 includes.Add (ns, "_" + prefix + ".xsd");
760 private /*static*/ XmlQualifiedName MapType (Type type)
762 switch (Type.GetTypeCode (type)) {
763 case TypeCode.String: return XmlConstants.QnString;
764 case TypeCode.Int16: return XmlConstants.QnShort;
765 case TypeCode.Int32: return XmlConstants.QnInt;
766 case TypeCode.Int64: return XmlConstants.QnLong;
767 case TypeCode.Boolean: return XmlConstants.QnBoolean;
768 case TypeCode.Byte: return XmlConstants.QnUnsignedByte;
769 //case TypeCode.Char: return XmlConstants.QnChar;
770 case TypeCode.DateTime: return XmlConstants.QnDateTime;
771 case TypeCode.Decimal: return XmlConstants.QnDecimal;
772 case TypeCode.Double: return XmlConstants.QnDouble;
773 case TypeCode.SByte: return XmlConstants.QnSbyte;
774 case TypeCode.Single: return XmlConstants.QnFloat;
775 case TypeCode.UInt16: return XmlConstants.QnUsignedShort;
776 case TypeCode.UInt32: return XmlConstants.QnUnsignedInt;
777 case TypeCode.UInt64: return XmlConstants.QnUnsignedLong;
780 if (typeof (TimeSpan) == type)
781 return XmlConstants.QnDuration;
782 else if (typeof (System.Uri) == type)
783 return XmlConstants.QnUri;
784 else if (typeof (byte[]) == type)
785 return XmlConstants.QnBase64Binary;
786 else if (typeof (XmlQualifiedName) == type)
787 return XmlConstants.QnXmlQualifiedName;
789 return XmlConstants.QnString;