2 // System.Xml.Serialization.XmlSchemaImporter
\r
5 // Tim Coleman (tim@timcoleman.com)
\r
6 // Lluis Sanchez Gual (lluis@ximian.com)
\r
8 // Copyright (C) Tim Coleman, 2002
\r
12 // Permission is hereby granted, free of charge, to any person obtaining
\r
13 // a copy of this software and associated documentation files (the
\r
14 // "Software"), to deal in the Software without restriction, including
\r
15 // without limitation the rights to use, copy, modify, merge, publish,
\r
16 // distribute, sublicense, and/or sell copies of the Software, and to
\r
17 // permit persons to whom the Software is furnished to do so, subject to
\r
18 // the following conditions:
\r
20 // The above copyright notice and this permission notice shall be
\r
21 // included in all copies or substantial portions of the Software.
\r
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
\r
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
\r
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
\r
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
33 using System.Xml.Schema;
\r
34 using System.Collections;
\r
36 namespace System.Xml.Serialization
\r
38 public class XmlSchemaImporter
\r
46 CodeIdentifiers typeIdentifiers;
\r
47 CodeIdentifiers elemIdentifiers = new CodeIdentifiers ();
\r
48 Hashtable mappedTypes = new Hashtable ();
\r
49 Hashtable dataMappedTypes = new Hashtable ();
\r
50 Queue pendingMaps = new Queue ();
\r
51 Hashtable sharedAnonymousTypes = new Hashtable ();
\r
52 bool encodedFormat = false;
\r
53 XmlReflectionImporter auxXmlRefImporter;
\r
54 SoapReflectionImporter auxSoapRefImporter;
\r
55 bool anyTypeImported;
\r
58 CodeGenerationOptions options;
\r
61 static readonly XmlQualifiedName anyType = new XmlQualifiedName ("anyType",XmlSchema.Namespace);
\r
62 static readonly XmlQualifiedName arrayType = new XmlQualifiedName ("Array",XmlSerializer.EncodingNamespace);
\r
63 static readonly XmlQualifiedName arrayTypeRefName = new XmlQualifiedName ("arrayType",XmlSerializer.EncodingNamespace);
\r
65 const string XmlNamespace = "http://www.w3.org/XML/1998/namespace";
\r
67 XmlSchemaElement anyElement = null;
\r
71 public XmlTypeMapping Map;
\r
72 public XmlSchemaComplexType SchemaType;
\r
73 public XmlQualifiedName TypeName;
\r
78 #region Constructors
\r
80 public XmlSchemaImporter (XmlSchemas schemas)
\r
82 this.schemas = schemas;
\r
83 typeIdentifiers = new CodeIdentifiers ();
\r
86 public XmlSchemaImporter (XmlSchemas schemas, CodeIdentifiers typeIdentifiers)
\r
89 this.typeIdentifiers = typeIdentifiers;
\r
94 public XmlSchemaImporter (XmlSchemas schemas, CodeGenerationOptions options, System.CodeDom.Compiler.ICodeGenerator codeGenerator, ImportContext context)
\r
96 this.schemas = schemas;
\r
97 this.options = options;
\r
98 if (context != null) {
\r
99 typeIdentifiers = context.TypeIdentifiers;
\r
100 InitSharedData (context);
\r
103 typeIdentifiers = new CodeIdentifiers ();
\r
106 public XmlSchemaImporter (XmlSchemas schemas, CodeGenerationOptions options, ImportContext context)
\r
108 this.schemas = schemas;
\r
109 this.options = options;
\r
110 if (context != null) {
\r
111 typeIdentifiers = context.TypeIdentifiers;
\r
112 InitSharedData (context);
\r
115 typeIdentifiers = new CodeIdentifiers ();
\r
119 public XmlSchemaImporter (XmlSchemas schemas, CodeIdentifiers typeIdentifiers, CodeGenerationOptions options)
\r
121 this.typeIdentifiers = typeIdentifiers;
\r
122 this.schemas = schemas;
\r
123 this.options = options;
\r
126 void InitSharedData (ImportContext context)
\r
128 if (context.ShareTypes) {
\r
129 mappedTypes = context.MappedTypes;
\r
130 dataMappedTypes = context.DataMappedTypes;
\r
131 sharedAnonymousTypes = context.SharedAnonymousTypes;
\r
136 internal bool UseEncodedFormat
\r
138 get { return encodedFormat; }
\r
139 set { encodedFormat = value; }
\r
142 #endregion // Constructors
\r
146 public XmlMembersMapping ImportAnyType (XmlQualifiedName typeName, string elementName)
\r
148 if (typeName == XmlQualifiedName.Empty)
\r
150 XmlTypeMapMemberAnyElement mapMem = new XmlTypeMapMemberAnyElement ();
\r
151 mapMem.Name = typeName.Name;
\r
152 mapMem.TypeData = TypeTranslator.GetTypeData(typeof(XmlNode));
\r
153 mapMem.ElementInfo.Add (CreateElementInfo (typeName.Namespace, mapMem, typeName.Name, mapMem.TypeData, true, XmlSchemaForm.None));
\r
155 XmlMemberMapping[] mm = new XmlMemberMapping [1];
\r
156 mm[0] = new XmlMemberMapping (typeName.Name, typeName.Namespace, mapMem, encodedFormat);
\r
157 return new XmlMembersMapping (mm);
\r
161 XmlSchemaComplexType stype = (XmlSchemaComplexType) schemas.Find (typeName, typeof (XmlSchemaComplexType));
\r
162 if (stype == null)
\r
163 throw new InvalidOperationException ("Referenced type '" + typeName + "' not found");
\r
165 if (!CanBeAnyElement (stype))
\r
166 throw new InvalidOperationException ("The type '" + typeName + "' is not valid for a collection of any elements");
\r
168 ClassMap cmap = new ClassMap ();
\r
169 CodeIdentifiers classIds = new CodeIdentifiers ();
\r
170 bool isMixed = stype.IsMixed;
\r
171 ImportSequenceContent (typeName, cmap, ((XmlSchemaSequence) stype.Particle).Items, classIds, false, ref isMixed);
\r
172 XmlTypeMapMemberAnyElement mapMem = (XmlTypeMapMemberAnyElement) cmap.AllMembers[0];
\r
173 mapMem.Name = typeName.Name;
\r
175 XmlMemberMapping[] mm = new XmlMemberMapping [1];
\r
176 mm[0] = new XmlMemberMapping (typeName.Name, typeName.Namespace, mapMem, encodedFormat);
\r
177 return new XmlMembersMapping (mm);
\r
181 public XmlTypeMapping ImportDerivedTypeMapping (XmlQualifiedName name, Type baseType)
\r
183 return ImportDerivedTypeMapping (name, baseType, true);
\r
186 public XmlTypeMapping ImportDerivedTypeMapping (XmlQualifiedName name, Type baseType, bool baseTypeCanBeIndirect)
\r
188 XmlQualifiedName qname;
\r
189 XmlSchemaType stype;
\r
194 stype = schemas.Find (name, typeof (XmlSchemaComplexType)) as XmlSchemaComplexType;
\r
195 if (stype == null) throw new InvalidOperationException ("Schema type '" + name + "' not found or not valid");
\r
199 if (!LocateElement (name, out qname, out stype))
\r
203 XmlTypeMapping map = GetRegisteredTypeMapping (qname);
\r
206 // If the type has already been imported, make sure that the map
\r
207 // has the requested base type
\r
209 SetMapBaseType (map, baseType);
\r
210 map.UpdateRoot (name);
\r
214 map = CreateTypeMapping (qname, SchemaTypes.Class, name);
\r
215 if (stype != null) {
\r
216 map.Documentation = GetDocumentation (stype);
\r
217 RegisterMapFixup (map, qname, (XmlSchemaComplexType)stype);
\r
219 ClassMap cmap = new ClassMap ();
\r
220 CodeIdentifiers classIds = new CodeIdentifiers ();
\r
221 map.ObjectMap = cmap;
\r
222 AddTextMember (qname, cmap, classIds);
\r
225 BuildPendingMaps ();
\r
226 SetMapBaseType (map, baseType);
\r
231 void SetMapBaseType (XmlTypeMapping map, Type baseType)
\r
233 // This method sets the base type for a given map.
\r
234 // If the map already inherits from this type, it does nothing.
\r
236 // Fiirst of all, check if the map already inherits from baseType
\r
238 XmlTypeMapping topMap = null;
\r
239 while (map != null)
\r
241 if (map.TypeData.Type == baseType)
\r
247 // Does not have the requested base type.
\r
248 // Then, get/create a map for that base type.
\r
250 XmlTypeMapping baseMap = ReflectType (baseType);
\r
252 // Add this map as a derived map of the base map
\r
254 topMap.BaseMap = baseMap;
\r
255 baseMap.DerivedTypes.Add (topMap);
\r
256 baseMap.DerivedTypes.AddRange (topMap.DerivedTypes);
\r
258 // Now add the base type fields to all derived maps
\r
260 ClassMap baseClassMap = (ClassMap)baseMap.ObjectMap;
\r
262 ClassMap cmap = (ClassMap)topMap.ObjectMap;
\r
263 foreach (XmlTypeMapMember member in baseClassMap.AllMembers)
\r
264 cmap.AddMember (member);
\r
266 foreach (XmlTypeMapping derivedMap in topMap.DerivedTypes)
\r
268 cmap = (ClassMap)derivedMap.ObjectMap;
\r
269 foreach (XmlTypeMapMember member in baseClassMap.AllMembers)
\r
270 cmap.AddMember (member);
\r
274 public XmlMembersMapping ImportMembersMapping (XmlQualifiedName name)
\r
276 XmlSchemaElement elem = (XmlSchemaElement) schemas.Find (name, typeof (XmlSchemaElement));
\r
277 if (elem == null) throw new InvalidOperationException ("Schema element '" + name + "' not found or not valid");
\r
279 XmlSchemaComplexType stype;
\r
280 if (elem.SchemaType != null)
\r
282 stype = elem.SchemaType as XmlSchemaComplexType;
\r
286 if (elem.SchemaTypeName.IsEmpty) return null;
\r
287 object type = schemas.Find (elem.SchemaTypeName, typeof (XmlSchemaComplexType));
\r
288 if (type == null) {
\r
289 if (IsPrimitiveTypeNamespace (elem.SchemaTypeName.Namespace)) return null;
\r
290 throw new InvalidOperationException ("Schema type '" + elem.SchemaTypeName + "' not found");
\r
292 stype = type as XmlSchemaComplexType;
\r
295 if (stype == null)
\r
296 throw new InvalidOperationException ("Schema element '" + name + "' not found or not valid");
\r
298 XmlMemberMapping[] mapping = ImportMembersMappingComposite (stype, name);
\r
299 return new XmlMembersMapping (name.Name, name.Namespace, mapping);
\r
302 public XmlMembersMapping ImportMembersMapping (XmlQualifiedName[] names)
\r
304 XmlMemberMapping[] mapping = new XmlMemberMapping [names.Length];
\r
305 for (int n=0; n<names.Length; n++)
\r
307 XmlSchemaElement elem = (XmlSchemaElement) schemas.Find (names[n], typeof (XmlSchemaElement));
\r
308 if (elem == null) throw new InvalidOperationException ("Schema element '" + names[n] + "' not found");
\r
310 XmlQualifiedName typeQName = new XmlQualifiedName ("Message", names[n].Namespace);
\r
311 XmlTypeMapping tmap;
\r
312 TypeData td = GetElementTypeData (typeQName, elem, names[n], out tmap);
\r
314 mapping[n] = ImportMemberMapping (elem.Name, typeQName.Namespace, elem.IsNillable, td, tmap);
\r
316 BuildPendingMaps ();
\r
317 return new XmlMembersMapping (mapping);
\r
322 public XmlMembersMapping ImportMembersMapping (string name, string ns, SoapSchemaMember[] members)
\r
324 throw new NotImplementedException ();
\r
328 public XmlTypeMapping ImportSchemaType (XmlQualifiedName typeName)
\r
330 throw new NotImplementedException ();
\r
334 public XmlTypeMapping ImportSchemaType (XmlQualifiedName typeName, Type baseType)
\r
336 throw new NotImplementedException ();
\r
340 public XmlTypeMapping ImportSchemaType (XmlQualifiedName typeName, Type baseType, bool baseTypeCanBeIndirect)
\r
342 throw new NotImplementedException ();
\r
346 internal XmlMembersMapping ImportEncodedMembersMapping (string name, string ns, SoapSchemaMember[] members, bool hasWrapperElement)
\r
348 XmlMemberMapping[] mapping = new XmlMemberMapping [members.Length];
\r
349 for (int n=0; n<members.Length; n++)
\r
351 TypeData td = GetTypeData (members[n].MemberType, null);
\r
352 XmlTypeMapping tmap = GetTypeMapping (td);
\r
353 mapping[n] = ImportMemberMapping (members[n].MemberName, members[n].MemberType.Namespace, true, td, tmap);
\r
355 BuildPendingMaps ();
\r
356 return new XmlMembersMapping (name, ns, hasWrapperElement, false, mapping);
\r
359 internal XmlMembersMapping ImportEncodedMembersMapping (string name, string ns, SoapSchemaMember member)
\r
361 XmlSchemaComplexType stype = schemas.Find (member.MemberType, typeof (XmlSchemaComplexType)) as XmlSchemaComplexType;
\r
362 if (stype == null) throw new InvalidOperationException ("Schema type '" + member.MemberType + "' not found or not valid");
\r
364 XmlMemberMapping[] mapping = ImportMembersMappingComposite (stype, member.MemberType);
\r
365 return new XmlMembersMapping (name, ns, mapping);
\r
368 XmlMemberMapping[] ImportMembersMappingComposite (XmlSchemaComplexType stype, XmlQualifiedName refer)
\r
370 if (stype.Particle == null)
\r
371 return new XmlMemberMapping [0];
\r
373 ClassMap cmap = new ClassMap ();
\r
375 XmlSchemaSequence seq = stype.Particle as XmlSchemaSequence;
\r
376 if (seq == null) throw new InvalidOperationException ("Schema element '" + refer + "' cannot be imported as XmlMembersMapping");
\r
378 CodeIdentifiers classIds = new CodeIdentifiers ();
\r
379 ImportParticleComplexContent (refer, cmap, seq, classIds, false);
\r
380 ImportAttributes (refer, cmap, stype.Attributes, stype.AnyAttribute, classIds);
\r
382 BuildPendingMaps ();
\r
385 XmlMemberMapping[] mapping = new XmlMemberMapping [cmap.AllMembers.Count];
\r
386 foreach (XmlTypeMapMember mapMem in cmap.AllMembers)
\r
387 mapping[n++] = new XmlMemberMapping (mapMem.Name, refer.Namespace, mapMem, encodedFormat);
\r
392 XmlMemberMapping ImportMemberMapping (string name, string ns, bool isNullable, TypeData type, XmlTypeMapping emap)
\r
394 XmlTypeMapMemberElement mapMem;
\r
396 if (type.IsListType)
\r
397 mapMem = new XmlTypeMapMemberList ();
\r
399 mapMem = new XmlTypeMapMemberElement ();
\r
401 mapMem.Name = name;
\r
402 mapMem.TypeData = type;
\r
403 mapMem.ElementInfo.Add (CreateElementInfo (ns, mapMem, name, type, isNullable, XmlSchemaForm.None, emap));
\r
404 return new XmlMemberMapping (name, ns, mapMem, encodedFormat);
\r
408 public XmlMembersMapping ImportMembersMapping (XmlQualifiedName[] names, Type baseType, bool baseTypeCanBeIndirect)
\r
410 throw new NotImplementedException ();
\r
413 public XmlTypeMapping ImportTypeMapping (XmlQualifiedName name)
\r
415 XmlQualifiedName qname;
\r
416 XmlSchemaType stype;
\r
418 XmlSchemaElement elem = (XmlSchemaElement) schemas.Find (name, typeof (XmlSchemaElement));
\r
419 if (!LocateElement (elem, out qname, out stype)) return null;
\r
421 if (stype == null) {
\r
422 // Importing a primitive type
\r
423 TypeData td = TypeTranslator.GetPrimitiveTypeData (qname.Name);
\r
424 return ReflectType (td, name.Namespace);
\r
427 XmlTypeMapping map = GetRegisteredTypeMapping (qname);
\r
428 if (map != null) return map;
\r
430 map = CreateTypeMapping (qname, SchemaTypes.Class, name);
\r
431 map.Documentation = GetDocumentation (stype);
\r
432 map.IsNullable = elem.IsNillable;
\r
433 RegisterMapFixup (map, qname, (XmlSchemaComplexType)stype);
\r
435 BuildPendingMaps ();
\r
439 bool LocateElement (XmlQualifiedName name, out XmlQualifiedName qname, out XmlSchemaType stype)
\r
441 XmlSchemaElement elem = (XmlSchemaElement) schemas.Find (name, typeof (XmlSchemaElement));
\r
442 return LocateElement (elem, out qname, out stype);
\r
445 bool LocateElement (XmlSchemaElement elem, out XmlQualifiedName qname, out XmlSchemaType stype)
\r
450 if (elem == null) return false;
\r
452 // The root element must be an element with complex type
\r
454 if (elem.SchemaType != null)
\r
456 stype = elem.SchemaType;
\r
457 qname = elem.QualifiedName;
\r
461 if (elem.SchemaTypeName.IsEmpty) return false;
\r
463 object type = schemas.Find (elem.SchemaTypeName, typeof (XmlSchemaComplexType));
\r
464 if (type == null) type = schemas.Find (elem.SchemaTypeName, typeof (XmlSchemaSimpleType));
\r
465 if (type == null) {
\r
466 if (IsPrimitiveTypeNamespace (elem.SchemaTypeName.Namespace)) {
\r
467 qname = elem.SchemaTypeName;
\r
470 throw new InvalidOperationException ("Schema type '" + elem.SchemaTypeName + "' not found");
\r
472 stype = (XmlSchemaType) type;
\r
473 qname = stype.QualifiedName;
\r
475 XmlSchemaType btype = stype.BaseSchemaType as XmlSchemaType;
\r
476 if (btype != null && btype.QualifiedName == elem.SchemaTypeName)
\r
477 throw new InvalidOperationException ("Cannot import schema for type '" + elem.SchemaTypeName.Name + "' from namespace '" + elem.SchemaTypeName.Namespace + "'. Redefine not supported");
\r
480 if (stype is XmlSchemaSimpleType) return false;
\r
484 XmlTypeMapping ImportType (XmlQualifiedName name, XmlQualifiedName root, bool throwOnError)
\r
486 XmlTypeMapping map = GetRegisteredTypeMapping (name);
\r
488 map.UpdateRoot (root);
\r
492 XmlSchemaType type = (XmlSchemaType) schemas.Find (name, typeof (XmlSchemaComplexType));
\r
493 if (type == null) type = (XmlSchemaType) schemas.Find (name, typeof (XmlSchemaSimpleType));
\r
497 if (throwOnError) {
\r
498 if (name.Namespace == XmlSerializer.EncodingNamespace)
\r
499 throw new InvalidOperationException ("Referenced type '" + name + "' valid only for encoded SOAP.");
\r
501 throw new InvalidOperationException ("Referenced type '" + name + "' not found.");
\r
506 return ImportType (name, type, root);
\r
509 XmlTypeMapping ImportClass (XmlQualifiedName name)
\r
511 XmlTypeMapping map = ImportType (name, null, true);
\r
512 if (map.TypeData.SchemaType == SchemaTypes.Class) return map;
\r
513 XmlSchemaComplexType stype = schemas.Find (name, typeof (XmlSchemaComplexType)) as XmlSchemaComplexType;
\r
514 return CreateClassMap (name, stype, new XmlQualifiedName (map.ElementName, map.Namespace));
\r
517 XmlTypeMapping ImportType (XmlQualifiedName name, XmlSchemaType stype, XmlQualifiedName root)
\r
519 XmlTypeMapping map = GetRegisteredTypeMapping (name);
\r
521 XmlSchemaComplexType ct = stype as XmlSchemaComplexType;
\r
522 if (map.TypeData.SchemaType != SchemaTypes.Class || ct == null || !CanBeArray (name, ct)) {
\r
523 map.UpdateRoot (root);
\r
527 // The map was initially imported as a class, but it turns out that it is an
\r
528 // array. It has to be imported now as array.
\r
531 if (stype is XmlSchemaComplexType)
\r
532 return ImportClassComplexType (name, (XmlSchemaComplexType) stype, root);
\r
533 else if (stype is XmlSchemaSimpleType)
\r
534 return ImportClassSimpleType (name, (XmlSchemaSimpleType) stype, root);
\r
536 throw new NotSupportedException ("Schema type not supported: " + stype.GetType ());
\r
539 XmlTypeMapping ImportClassComplexType (XmlQualifiedName typeQName, XmlSchemaComplexType stype, XmlQualifiedName root)
\r
541 // The need for fixups: If the complex type is an array, then to get the type of the
\r
542 // array we need first to get the type of the items of the array.
\r
543 // But if one of the item types or its children has a referece to this type array,
\r
544 // then we enter in an infinite loop. This does not happen with class types because
\r
545 // the class map is registered before parsing the children. We can't do the same
\r
546 // with the array type because to register the array map we need the type of the array.
\r
548 Type anyType = GetAnyElementType (stype);
\r
549 if (anyType != null)
\r
550 return GetTypeMapping (TypeTranslator.GetTypeData(anyType));
\r
552 if (CanBeArray (typeQName, stype))
\r
555 ListMap listMap = BuildArrayMap (typeQName, stype, out typeData);
\r
556 if (listMap != null)
\r
558 XmlTypeMapping map = CreateArrayTypeMapping (typeQName, typeData);
\r
559 map.ObjectMap = listMap;
\r
563 // After all, it is not an array. Create a class map then.
\r
565 else if (CanBeIXmlSerializable (stype))
\r
567 return ImportXmlSerializableMapping (typeQName.Namespace);
\r
570 // Register the map right now but do not build it,
\r
571 // This will avoid loops.
\r
573 return CreateClassMap (typeQName, stype, root);
\r
576 XmlTypeMapping CreateClassMap (XmlQualifiedName typeQName, XmlSchemaComplexType stype, XmlQualifiedName root)
\r
578 XmlTypeMapping map = CreateTypeMapping (typeQName, SchemaTypes.Class, root);
\r
579 map.Documentation = GetDocumentation (stype);
\r
580 RegisterMapFixup (map, typeQName, stype);
\r
584 void RegisterMapFixup (XmlTypeMapping map, XmlQualifiedName typeQName, XmlSchemaComplexType stype)
\r
586 MapFixup fixup = new MapFixup ();
\r
588 fixup.SchemaType = stype;
\r
589 fixup.TypeName = typeQName;
\r
590 pendingMaps.Enqueue (fixup);
\r
593 void BuildPendingMaps ()
\r
595 while (pendingMaps.Count > 0) {
\r
596 MapFixup fixup = (MapFixup) pendingMaps.Dequeue ();
\r
597 if (fixup.Map.ObjectMap == null) {
\r
598 BuildClassMap (fixup.Map, fixup.TypeName, fixup.SchemaType);
\r
599 if (fixup.Map.ObjectMap == null) pendingMaps.Enqueue (fixup);
\r
604 void BuildPendingMap (XmlTypeMapping map)
\r
606 if (map.ObjectMap != null) return;
\r
608 foreach (MapFixup fixup in pendingMaps)
\r
610 if (fixup.Map == map) {
\r
611 BuildClassMap (fixup.Map, fixup.TypeName, fixup.SchemaType);
\r
615 throw new InvalidOperationException ("Can't complete map of type " + map.XmlType + " : " + map.Namespace);
\r
618 void BuildClassMap (XmlTypeMapping map, XmlQualifiedName typeQName, XmlSchemaComplexType stype)
\r
620 CodeIdentifiers classIds = new CodeIdentifiers();
\r
621 classIds.AddReserved (map.TypeData.TypeName);
\r
623 ClassMap cmap = new ClassMap ();
\r
624 map.ObjectMap = cmap;
\r
625 bool isMixed = stype.IsMixed;
\r
627 if (stype.Particle != null)
\r
628 ImportParticleComplexContent (typeQName, cmap, stype.Particle, classIds, isMixed);
\r
631 if (stype.ContentModel is XmlSchemaSimpleContent) {
\r
632 ImportSimpleContent (typeQName, map, (XmlSchemaSimpleContent)stype.ContentModel, classIds, isMixed);
\r
634 else if (stype.ContentModel is XmlSchemaComplexContent) {
\r
635 ImportComplexContent (typeQName, map, (XmlSchemaComplexContent)stype.ContentModel, classIds, isMixed);
\r
639 ImportAttributes (typeQName, cmap, stype.Attributes, stype.AnyAttribute, classIds);
\r
640 ImportExtensionTypes (typeQName);
\r
642 if (isMixed) AddTextMember (typeQName, cmap, classIds);
\r
644 AddObjectDerivedMap (map);
\r
647 void ImportAttributes (XmlQualifiedName typeQName, ClassMap cmap, XmlSchemaObjectCollection atts, XmlSchemaAnyAttribute anyat, CodeIdentifiers classIds)
\r
651 XmlTypeMapMemberAnyAttribute member = new XmlTypeMapMemberAnyAttribute ();
\r
652 member.Name = classIds.AddUnique ("AnyAttribute", member);
\r
653 member.TypeData = TypeTranslator.GetTypeData (typeof(XmlAttribute[]));
\r
654 cmap.AddMember (member);
\r
657 foreach (XmlSchemaObject at in atts)
\r
659 if (at is XmlSchemaAttribute)
\r
662 XmlSchemaAttribute attr = (XmlSchemaAttribute)at;
\r
663 XmlSchemaAttribute refAttr = GetRefAttribute (typeQName, attr, out ns);
\r
664 XmlTypeMapMemberAttribute member = new XmlTypeMapMemberAttribute ();
\r
665 member.Name = classIds.AddUnique (CodeIdentifier.MakeValid (refAttr.Name), member);
\r
666 member.Documentation = GetDocumentation (attr);
\r
667 member.AttributeName = refAttr.Name;
\r
668 member.Namespace = ns;
\r
669 member.Form = refAttr.Form;
\r
670 member.TypeData = GetAttributeTypeData (typeQName, attr);
\r
672 if (refAttr.DefaultValue != null)
\r
673 member.DefaultValue = ImportDefaultValue (member.TypeData, refAttr.DefaultValue);
\r
674 else if (member.TypeData.IsValueType)
\r
675 member.IsOptionalValueType = (refAttr.ValidatedUse != XmlSchemaUse.Required);
\r
677 if (member.TypeData.IsComplexType)
\r
678 member.MappedType = GetTypeMapping (member.TypeData);
\r
679 cmap.AddMember (member);
\r
681 else if (at is XmlSchemaAttributeGroupRef)
\r
683 XmlSchemaAttributeGroupRef gref = (XmlSchemaAttributeGroupRef)at;
\r
684 XmlSchemaAttributeGroup grp = FindRefAttributeGroup (gref.RefName);
\r
685 ImportAttributes (typeQName, cmap, grp.Attributes, grp.AnyAttribute, classIds);
\r
690 ListMap BuildArrayMap (XmlQualifiedName typeQName, XmlSchemaComplexType stype, out TypeData arrayTypeData)
\r
694 XmlSchemaComplexContent content = stype.ContentModel as XmlSchemaComplexContent;
\r
695 XmlSchemaComplexContentRestriction rest = content.Content as XmlSchemaComplexContentRestriction;
\r
696 XmlSchemaAttribute arrayTypeAt = FindArrayAttribute (rest.Attributes);
\r
698 if (arrayTypeAt != null)
\r
700 XmlAttribute[] uatts = arrayTypeAt.UnhandledAttributes;
\r
701 if (uatts == null || uatts.Length == 0) throw new InvalidOperationException ("arrayType attribute not specified in array declaration: " + typeQName);
\r
703 XmlAttribute xat = null;
\r
704 foreach (XmlAttribute at in uatts)
\r
705 if (at.LocalName == "arrayType" && at.NamespaceURI == XmlSerializer.WsdlNamespace)
\r
706 { xat = at; break; }
\r
709 throw new InvalidOperationException ("arrayType attribute not specified in array declaration: " + typeQName);
\r
711 string name, ns, dims;
\r
712 TypeTranslator.ParseArrayType (xat.Value, out name, out ns, out dims);
\r
713 return BuildEncodedArrayMap (name + dims, ns, out arrayTypeData);
\r
717 XmlSchemaElement elem = null;
\r
718 XmlSchemaSequence seq = rest.Particle as XmlSchemaSequence;
\r
719 if (seq != null && seq.Items.Count == 1)
\r
720 elem = seq.Items[0] as XmlSchemaElement;
\r
722 XmlSchemaAll all = rest.Particle as XmlSchemaAll;
\r
723 if (all != null && all.Items.Count == 1)
\r
724 elem = all.Items[0] as XmlSchemaElement;
\r
727 throw new InvalidOperationException ("Unknown array format");
\r
729 return BuildEncodedArrayMap (elem.SchemaTypeName.Name + "[]", elem.SchemaTypeName.Namespace, out arrayTypeData);
\r
734 ClassMap cmap = new ClassMap ();
\r
735 CodeIdentifiers classIds = new CodeIdentifiers();
\r
736 ImportParticleComplexContent (typeQName, cmap, stype.Particle, classIds, stype.IsMixed);
\r
738 XmlTypeMapMemberFlatList list = (cmap.AllMembers.Count == 1) ? cmap.AllMembers[0] as XmlTypeMapMemberFlatList : null;
\r
739 if (list != null && list.ChoiceMember == null)
\r
741 arrayTypeData = list.TypeData;
\r
742 return list.ListMap;
\r
746 arrayTypeData = null;
\r
752 ListMap BuildEncodedArrayMap (string type, string ns, out TypeData arrayTypeData)
\r
754 ListMap map = new ListMap ();
\r
756 int i = type.LastIndexOf ("[");
\r
757 if (i == -1) throw new InvalidOperationException ("Invalid arrayType value: " + type);
\r
758 if (type.IndexOf (",",i) != -1) throw new InvalidOperationException ("Multidimensional arrays are not supported");
\r
760 string itemType = type.Substring (0,i);
\r
762 TypeData itemTypeData;
\r
763 if (itemType.IndexOf ("[") != -1)
\r
765 ListMap innerListMap = BuildEncodedArrayMap (itemType, ns, out itemTypeData);
\r
767 int dims = itemType.Split ('[').Length - 1;
\r
768 string name = TypeTranslator.GetArrayName (type, dims);
\r
769 XmlQualifiedName qname = new XmlQualifiedName (name, ns);
\r
770 XmlTypeMapping tmap = CreateArrayTypeMapping (qname, itemTypeData);
\r
771 tmap.ObjectMap = innerListMap;
\r
775 itemTypeData = GetTypeData (new XmlQualifiedName (itemType, ns), null);
\r
778 arrayTypeData = itemTypeData.ListTypeData;
\r
780 map.ItemInfo = new XmlTypeMapElementInfoList();
\r
781 map.ItemInfo.Add (CreateElementInfo ("", null, "Item", itemTypeData, true, XmlSchemaForm.None));
\r
785 XmlSchemaAttribute FindArrayAttribute (XmlSchemaObjectCollection atts)
\r
787 foreach (object ob in atts)
\r
789 XmlSchemaAttribute att = ob as XmlSchemaAttribute;
\r
790 if (att != null && att.RefName == arrayTypeRefName) return att;
\r
792 XmlSchemaAttributeGroupRef gref = ob as XmlSchemaAttributeGroupRef;
\r
795 XmlSchemaAttributeGroup grp = FindRefAttributeGroup (gref.RefName);
\r
796 att = FindArrayAttribute (grp.Attributes);
\r
797 if (att != null) return att;
\r
803 void ImportParticleComplexContent (XmlQualifiedName typeQName, ClassMap cmap, XmlSchemaParticle particle, CodeIdentifiers classIds, bool isMixed)
\r
805 ImportParticleContent (typeQName, cmap, particle, classIds, false, ref isMixed);
\r
806 if (isMixed) AddTextMember (typeQName, cmap, classIds);
\r
809 void AddTextMember (XmlQualifiedName typeQName, ClassMap cmap, CodeIdentifiers classIds)
\r
811 if (cmap.XmlTextCollector == null)
\r
813 XmlTypeMapMemberFlatList member = new XmlTypeMapMemberFlatList ();
\r
814 member.Name = classIds.AddUnique ("Text", member);
\r
815 member.TypeData = TypeTranslator.GetTypeData (typeof(string[]));
\r
816 member.ElementInfo.Add (CreateTextElementInfo (typeQName.Namespace, member, member.TypeData.ListItemTypeData));
\r
817 member.IsXmlTextCollector = true;
\r
818 member.ListMap = new ListMap ();
\r
819 member.ListMap.ItemInfo = member.ElementInfo;
\r
820 cmap.AddMember (member);
\r
824 void ImportParticleContent (XmlQualifiedName typeQName, ClassMap cmap, XmlSchemaParticle particle, CodeIdentifiers classIds, bool multiValue, ref bool isMixed)
\r
826 if (particle == null) return;
\r
828 if (particle is XmlSchemaGroupRef)
\r
829 particle = GetRefGroupParticle ((XmlSchemaGroupRef)particle);
\r
831 if (particle.MaxOccurs > 1) multiValue = true;
\r
833 if (particle is XmlSchemaSequence) {
\r
834 ImportSequenceContent (typeQName, cmap, ((XmlSchemaSequence)particle).Items, classIds, multiValue, ref isMixed);
\r
836 else if (particle is XmlSchemaChoice) {
\r
837 if (((XmlSchemaChoice)particle).Items.Count == 1)
\r
838 ImportSequenceContent (typeQName, cmap, ((XmlSchemaChoice)particle).Items, classIds, multiValue, ref isMixed);
\r
840 ImportChoiceContent (typeQName, cmap, (XmlSchemaChoice)particle, classIds, multiValue);
\r
842 else if (particle is XmlSchemaAll) {
\r
843 ImportSequenceContent (typeQName, cmap, ((XmlSchemaAll)particle).Items, classIds, multiValue, ref isMixed);
\r
847 void ImportSequenceContent (XmlQualifiedName typeQName, ClassMap cmap, XmlSchemaObjectCollection items, CodeIdentifiers classIds, bool multiValue, ref bool isMixed)
\r
849 foreach (XmlSchemaObject item in items)
\r
851 if (item is XmlSchemaElement)
\r
854 XmlSchemaElement elem = (XmlSchemaElement) item;
\r
855 XmlTypeMapping emap;
\r
856 TypeData typeData = GetElementTypeData (typeQName, elem, null, out emap);
\r
857 XmlSchemaElement refElem = GetRefElement (typeQName, elem, out ns);
\r
859 if (elem.MaxOccurs == 1 && !multiValue)
\r
861 XmlTypeMapMemberElement member = null;
\r
862 if (typeData.SchemaType != SchemaTypes.Array)
\r
864 member = new XmlTypeMapMemberElement ();
\r
865 if (refElem.DefaultValue != null) member.DefaultValue = ImportDefaultValue (typeData, refElem.DefaultValue);
\r
867 else if (GetTypeMapping (typeData).IsSimpleType)
\r
869 // It is a simple list (space separated list).
\r
870 // Since this is not supported, map as a single item value
\r
871 // TODO: improve this
\r
872 member = new XmlTypeMapMemberElement ();
\r
873 typeData = typeData.ListItemTypeData;
\r
876 member = new XmlTypeMapMemberList ();
\r
878 if (elem.MinOccurs == 0 && typeData.IsValueType)
\r
879 member.IsOptionalValueType = true;
\r
881 member.Name = classIds.AddUnique(CodeIdentifier.MakeValid(refElem.Name), member);
\r
882 member.Documentation = GetDocumentation (elem);
\r
883 member.TypeData = typeData;
\r
884 member.ElementInfo.Add (CreateElementInfo (ns, member, refElem.Name, typeData, refElem.IsNillable, refElem.Form, emap));
\r
885 cmap.AddMember (member);
\r
889 XmlTypeMapMemberFlatList member = new XmlTypeMapMemberFlatList ();
\r
890 member.ListMap = new ListMap ();
\r
891 member.Name = classIds.AddUnique(CodeIdentifier.MakeValid(refElem.Name), member);
\r
892 member.Documentation = GetDocumentation (elem);
\r
893 member.TypeData = typeData.ListTypeData;
\r
894 member.ElementInfo.Add (CreateElementInfo (ns, member, refElem.Name, typeData, refElem.IsNillable, refElem.Form, emap));
\r
895 member.ListMap.ItemInfo = member.ElementInfo;
\r
896 cmap.AddMember (member);
\r
899 else if (item is XmlSchemaAny)
\r
901 XmlSchemaAny elem = (XmlSchemaAny) item;
\r
902 XmlTypeMapMemberAnyElement member = new XmlTypeMapMemberAnyElement ();
\r
903 member.Name = classIds.AddUnique ("Any", member);
\r
904 member.Documentation = GetDocumentation (elem);
\r
907 if (elem.MaxOccurs != 1 || multiValue)
\r
908 ctype = isMixed ? typeof(XmlNode[]) : typeof(XmlElement[]);
\r
910 ctype = isMixed ? typeof(XmlNode) : typeof(XmlElement);
\r
912 member.TypeData = TypeTranslator.GetTypeData (ctype);
\r
913 XmlTypeMapElementInfo einfo = new XmlTypeMapElementInfo (member, member.TypeData);
\r
914 einfo.IsUnnamedAnyElement = true;
\r
915 member.ElementInfo.Add (einfo);
\r
919 einfo = CreateTextElementInfo (typeQName.Namespace, member, member.TypeData);
\r
920 member.ElementInfo.Add (einfo);
\r
921 member.IsXmlTextCollector = true;
\r
922 isMixed = false; //Allow only one XmlTextAttribute
\r
925 cmap.AddMember (member);
\r
927 else if (item is XmlSchemaParticle) {
\r
928 ImportParticleContent (typeQName, cmap, (XmlSchemaParticle)item, classIds, multiValue, ref isMixed);
\r
933 object ImportDefaultValue (TypeData typeData, string value)
\r
935 if (typeData.SchemaType == SchemaTypes.Enum) {
\r
936 XmlTypeMapping map = GetTypeMapping (typeData);
\r
937 EnumMap emap = (EnumMap) map.ObjectMap;
\r
938 string res = emap.GetEnumName (map.TypeFullName, value);
\r
939 if (res == null) throw new InvalidOperationException ("'" + value + "' is not a valid enumeration value");
\r
942 return XmlCustomFormatter.FromXmlString (typeData, value);
\r
945 void ImportChoiceContent (XmlQualifiedName typeQName, ClassMap cmap, XmlSchemaChoice choice, CodeIdentifiers classIds, bool multiValue)
\r
947 XmlTypeMapElementInfoList choices = new XmlTypeMapElementInfoList ();
\r
948 multiValue = ImportChoices (typeQName, null, choices, choice.Items) || multiValue;
\r
949 if (choices.Count == 0) return;
\r
951 if (choice.MaxOccurs > 1) multiValue = true;
\r
953 XmlTypeMapMemberElement member;
\r
956 member = new XmlTypeMapMemberFlatList ();
\r
957 member.Name = classIds.AddUnique ("Items", member);
\r
958 ListMap listMap = new ListMap ();
\r
959 listMap.ItemInfo = choices;
\r
960 ((XmlTypeMapMemberFlatList)member).ListMap = listMap;
\r
964 member = new XmlTypeMapMemberElement ();
\r
965 member.Name = classIds.AddUnique ("Item", member);
\r
968 // If all choices have the same type, use that type for the member.
\r
969 // If not use System.Object.
\r
970 // If there are at least two choices with the same type, use a choice
\r
971 // identifier attribute
\r
973 TypeData typeData = null;
\r
974 bool twoEqual = false;
\r
975 bool allEqual = true;
\r
976 Hashtable types = new Hashtable ();
\r
978 for (int n = choices.Count - 1; n >= 0; n--)
\r
980 XmlTypeMapElementInfo einfo = (XmlTypeMapElementInfo) choices [n];
\r
982 // In some complex schemas, we may end up with several options
\r
983 // with the same name. It is better to ignore the extra options
\r
984 // than to crash. It's the best we can do, and btw it works
\r
985 // better than in MS.NET.
\r
987 if (cmap.GetElement (einfo.ElementName, einfo.Namespace) != null ||
\r
988 choices.IndexOfElement (einfo.ElementName, einfo.Namespace) != n)
\r
990 choices.RemoveAt (n);
\r
994 if (types.ContainsKey (einfo.TypeData)) twoEqual = true;
\r
995 else types.Add (einfo.TypeData, einfo);
\r
997 TypeData choiceType = einfo.TypeData;
\r
998 if (choiceType.SchemaType == SchemaTypes.Class)
\r
1000 // When comparing class types, use the most generic class in the
\r
1001 // inheritance hierarchy
\r
1003 XmlTypeMapping choiceMap = GetTypeMapping (choiceType);
\r
1004 BuildPendingMap (choiceMap);
\r
1005 while (choiceMap.BaseMap != null) {
\r
1006 choiceMap = choiceMap.BaseMap;
\r
1007 BuildPendingMap (choiceMap);
\r
1008 choiceType = choiceMap.TypeData;
\r
1012 if (typeData == null) typeData = choiceType;
\r
1013 else if (typeData != choiceType) allEqual = false;
\r
1017 typeData = TypeTranslator.GetTypeData (typeof(object));
\r
1021 // Create the choice member
\r
1022 XmlTypeMapMemberElement choiceMember = new XmlTypeMapMemberElement ();
\r
1023 choiceMember.Ignore = true;
\r
1024 choiceMember.Name = classIds.AddUnique (member.Name + "ElementName", choiceMember);
\r
1025 member.ChoiceMember = choiceMember.Name;
\r
1027 // Create the choice enum
\r
1028 XmlTypeMapping enumMap = CreateTypeMapping (new XmlQualifiedName (member.Name + "ChoiceType", typeQName.Namespace), SchemaTypes.Enum, null);
\r
1029 enumMap.IncludeInSchema = false;
\r
1031 CodeIdentifiers codeIdents = new CodeIdentifiers ();
\r
1032 EnumMap.EnumMapMember[] members = new EnumMap.EnumMapMember [choices.Count];
\r
1033 for (int n=0; n<choices.Count; n++)
\r
1035 XmlTypeMapElementInfo it =(XmlTypeMapElementInfo) choices[n];
\r
1036 bool extraNs = (it.Namespace != null && it.Namespace != "" && it.Namespace != typeQName.Namespace);
\r
1037 string xmlName = extraNs ? it.Namespace + ":" + it.ElementName : it.ElementName;
\r
1038 string enumName = codeIdents.AddUnique (CodeIdentifier.MakeValid (it.ElementName), it);
\r
1039 members [n] = new EnumMap.EnumMapMember (xmlName, enumName);
\r
1041 enumMap.ObjectMap = new EnumMap (members, false);
\r
1043 choiceMember.TypeData = multiValue ? enumMap.TypeData.ListTypeData : enumMap.TypeData;
\r
1044 choiceMember.ElementInfo.Add (CreateElementInfo (typeQName.Namespace, choiceMember, choiceMember.Name, choiceMember.TypeData, false, XmlSchemaForm.None));
\r
1045 cmap.AddMember (choiceMember);
\r
1049 typeData = typeData.ListTypeData;
\r
1051 member.ElementInfo = choices;
\r
1052 member.Documentation = GetDocumentation (choice);
\r
1053 member.TypeData = typeData;
\r
1054 cmap.AddMember (member);
\r
1057 bool ImportChoices (XmlQualifiedName typeQName, XmlTypeMapMember member, XmlTypeMapElementInfoList choices, XmlSchemaObjectCollection items)
\r
1059 bool multiValue = false;
\r
1060 foreach (XmlSchemaObject titem in items)
\r
1062 XmlSchemaObject item = titem;
\r
1063 if (item is XmlSchemaGroupRef)
\r
1064 item = GetRefGroupParticle ((XmlSchemaGroupRef)item);
\r
1066 if (item is XmlSchemaElement)
\r
1069 XmlSchemaElement elem = (XmlSchemaElement) item;
\r
1070 XmlTypeMapping emap;
\r
1071 TypeData typeData = GetElementTypeData (typeQName, elem, null, out emap);
\r
1072 XmlSchemaElement refElem = GetRefElement (typeQName, elem, out ns);
\r
1073 choices.Add (CreateElementInfo (ns, member, refElem.Name, typeData, refElem.IsNillable, refElem.Form, emap));
\r
1074 if (elem.MaxOccurs > 1) multiValue = true;
\r
1076 else if (item is XmlSchemaAny)
\r
1078 XmlTypeMapElementInfo einfo = new XmlTypeMapElementInfo (member, TypeTranslator.GetTypeData(typeof(XmlElement)));
\r
1079 einfo.IsUnnamedAnyElement = true;
\r
1080 choices.Add (einfo);
\r
1082 else if (item is XmlSchemaChoice) {
\r
1083 multiValue = ImportChoices (typeQName, member, choices, ((XmlSchemaChoice)item).Items) || multiValue;
\r
1085 else if (item is XmlSchemaSequence) {
\r
1086 multiValue = ImportChoices (typeQName, member, choices, ((XmlSchemaSequence)item).Items) || multiValue;
\r
1089 return multiValue;
\r
1092 void ImportSimpleContent (XmlQualifiedName typeQName, XmlTypeMapping map, XmlSchemaSimpleContent content, CodeIdentifiers classIds, bool isMixed)
\r
1094 XmlSchemaSimpleContentExtension ext = content.Content as XmlSchemaSimpleContentExtension;
\r
1095 ClassMap cmap = (ClassMap)map.ObjectMap;
\r
1096 XmlQualifiedName qname = GetContentBaseType (content.Content);
\r
1097 TypeData simpleType = null;
\r
1099 if (!IsPrimitiveTypeNamespace (qname.Namespace))
\r
1101 // Add base map members to this map
\r
1103 XmlTypeMapping baseMap = ImportType (qname, null, true);
\r
1104 BuildPendingMap (baseMap);
\r
1106 if (baseMap.IsSimpleType) {
\r
1107 simpleType = baseMap.TypeData;
\r
1109 ClassMap baseClassMap = (ClassMap)baseMap.ObjectMap;
\r
1111 foreach (XmlTypeMapMember member in baseClassMap.AllMembers)
\r
1112 cmap.AddMember (member);
\r
1114 map.BaseMap = baseMap;
\r
1115 baseMap.DerivedTypes.Add (map);
\r
1119 simpleType = FindBuiltInType (qname);
\r
1121 if (simpleType != null) {
\r
1122 XmlTypeMapMemberElement member = new XmlTypeMapMemberElement ();
\r
1123 member.Name = classIds.AddUnique("Value", member);
\r
1124 member.TypeData = simpleType;
\r
1125 member.ElementInfo.Add (CreateTextElementInfo (typeQName.Namespace, member, member.TypeData));
\r
1126 member.IsXmlTextCollector = true;
\r
1127 cmap.AddMember (member);
\r
1131 ImportAttributes (typeQName, cmap, ext.Attributes, ext.AnyAttribute, classIds);
\r
1134 TypeData FindBuiltInType (XmlQualifiedName qname)
\r
1136 XmlSchemaComplexType ct = (XmlSchemaComplexType) schemas.Find (qname, typeof(XmlSchemaComplexType));
\r
1139 XmlSchemaSimpleContent sc = ct.ContentModel as XmlSchemaSimpleContent;
\r
1140 if (sc == null) throw new InvalidOperationException ("Invalid schema");
\r
1141 return FindBuiltInType (GetContentBaseType (sc.Content));
\r
1144 XmlSchemaSimpleType st = (XmlSchemaSimpleType) schemas.Find (qname, typeof(XmlSchemaSimpleType));
\r
1146 return FindBuiltInType (qname, st);
\r
1148 if (IsPrimitiveTypeNamespace (qname.Namespace))
\r
1149 return TypeTranslator.GetPrimitiveTypeData (qname.Name);
\r
1151 throw new InvalidOperationException ("Definition of type '" + qname + "' not found");
\r
1154 TypeData FindBuiltInType (XmlQualifiedName qname, XmlSchemaSimpleType st)
\r
1156 if (CanBeEnum (st))
\r
1157 return ImportType (qname, null, true).TypeData;
\r
1159 if (st.Content is XmlSchemaSimpleTypeRestriction) {
\r
1160 XmlSchemaSimpleTypeRestriction rest = (XmlSchemaSimpleTypeRestriction) st.Content;
\r
1161 XmlQualifiedName bn = GetContentBaseType (rest);
\r
1162 if (bn == XmlQualifiedName.Empty && rest.BaseType != null)
\r
1163 return FindBuiltInType (qname, rest.BaseType);
\r
1165 return FindBuiltInType (bn);
\r
1167 else if (st.Content is XmlSchemaSimpleTypeList) {
\r
1168 return FindBuiltInType (GetContentBaseType (st.Content)).ListTypeData;
\r
1170 else if (st.Content is XmlSchemaSimpleTypeUnion)
\r
1172 // Check if all types of the union are equal. If not, then will use anyType.
\r
1173 XmlSchemaSimpleTypeUnion uni = (XmlSchemaSimpleTypeUnion) st.Content;
\r
1174 TypeData utype = null;
\r
1176 // Anonymous types are unique
\r
1177 if (uni.BaseTypes.Count != 0 && uni.MemberTypes.Length != 0)
\r
1178 return FindBuiltInType (anyType);
\r
1180 foreach (XmlQualifiedName mt in uni.MemberTypes)
\r
1182 TypeData qn = FindBuiltInType (mt);
\r
1183 if (utype != null && qn != utype) return FindBuiltInType (anyType);
\r
1192 XmlQualifiedName GetContentBaseType (XmlSchemaObject ob)
\r
1194 if (ob is XmlSchemaSimpleContentExtension)
\r
1195 return ((XmlSchemaSimpleContentExtension)ob).BaseTypeName;
\r
1196 else if (ob is XmlSchemaSimpleContentRestriction)
\r
1197 return ((XmlSchemaSimpleContentRestriction)ob).BaseTypeName;
\r
1198 else if (ob is XmlSchemaSimpleTypeRestriction)
\r
1199 return ((XmlSchemaSimpleTypeRestriction)ob).BaseTypeName;
\r
1200 else if (ob is XmlSchemaSimpleTypeList)
\r
1201 return ((XmlSchemaSimpleTypeList)ob).ItemTypeName;
\r
1206 void ImportComplexContent (XmlQualifiedName typeQName, XmlTypeMapping map, XmlSchemaComplexContent content, CodeIdentifiers classIds, bool isMixed)
\r
1208 ClassMap cmap = (ClassMap)map.ObjectMap;
\r
1209 XmlQualifiedName qname;
\r
1211 XmlSchemaComplexContentExtension ext = content.Content as XmlSchemaComplexContentExtension;
\r
1212 if (ext != null) qname = ext.BaseTypeName;
\r
1213 else qname = ((XmlSchemaComplexContentRestriction)content.Content).BaseTypeName;
\r
1215 if (qname == typeQName)
\r
1216 throw new InvalidOperationException ("Cannot import schema for type '" + typeQName.Name + "' from namespace '" + typeQName.Namespace + "'. Redefine not supported");
\r
1218 // Add base map members to this map
\r
1220 XmlTypeMapping baseMap = ImportClass (qname);
\r
1221 BuildPendingMap (baseMap);
\r
1222 ClassMap baseClassMap = (ClassMap)baseMap.ObjectMap;
\r
1224 foreach (XmlTypeMapMember member in baseClassMap.AllMembers)
\r
1225 cmap.AddMember (member);
\r
1227 if (baseClassMap.XmlTextCollector != null) isMixed = false;
\r
1228 else if (content.IsMixed) isMixed = true;
\r
1230 map.BaseMap = baseMap;
\r
1231 baseMap.DerivedTypes.Add (map);
\r
1233 if (ext != null) {
\r
1234 // Add the members of this map
\r
1235 ImportParticleComplexContent (typeQName, cmap, ext.Particle, classIds, isMixed);
\r
1236 ImportAttributes (typeQName, cmap, ext.Attributes, ext.AnyAttribute, classIds);
\r
1239 if (isMixed) ImportParticleComplexContent (typeQName, cmap, null, classIds, true);
\r
1243 void ImportExtensionTypes (XmlQualifiedName qname)
\r
1245 foreach (XmlSchema schema in schemas) {
\r
1246 foreach (XmlSchemaObject sob in schema.Items)
\r
1248 XmlSchemaComplexType sct = sob as XmlSchemaComplexType;
\r
1249 if (sct != null && sct.ContentModel is XmlSchemaComplexContent) {
\r
1250 XmlQualifiedName exqname;
\r
1251 XmlSchemaComplexContentExtension ext = sct.ContentModel.Content as XmlSchemaComplexContentExtension;
\r
1252 if (ext != null) exqname = ext.BaseTypeName;
\r
1253 else exqname = ((XmlSchemaComplexContentRestriction)sct.ContentModel.Content).BaseTypeName;
\r
1254 if (exqname == qname)
\r
1255 ImportType (new XmlQualifiedName (sct.Name, schema.TargetNamespace), sct, null);
\r
1261 XmlTypeMapping ImportClassSimpleType (XmlQualifiedName typeQName, XmlSchemaSimpleType stype, XmlQualifiedName root)
\r
1263 if (CanBeEnum (stype))
\r
1265 // Create an enum map
\r
1267 CodeIdentifiers codeIdents = new CodeIdentifiers ();
\r
1268 XmlTypeMapping enumMap = CreateTypeMapping (typeQName, SchemaTypes.Enum, null);
\r
1269 enumMap.Documentation = GetDocumentation (stype);
\r
1271 bool isFlags = false;
\r
1272 if (stype.Content is XmlSchemaSimpleTypeList) {
\r
1273 stype = ((XmlSchemaSimpleTypeList)stype.Content).ItemType;
\r
1276 XmlSchemaSimpleTypeRestriction rest = (XmlSchemaSimpleTypeRestriction)stype.Content;
\r
1278 codeIdents.AddReserved (enumMap.TypeData.TypeName);
\r
1280 EnumMap.EnumMapMember[] members = new EnumMap.EnumMapMember [rest.Facets.Count];
\r
1281 for (int n=0; n<rest.Facets.Count; n++)
\r
1283 XmlSchemaEnumerationFacet enu = (XmlSchemaEnumerationFacet) rest.Facets[n];
\r
1284 string enumName = codeIdents.AddUnique(CodeIdentifier.MakeValid (enu.Value), enu);
\r
1285 members [n] = new EnumMap.EnumMapMember (enu.Value, enumName);
\r
1286 members [n].Documentation = GetDocumentation (enu);
\r
1288 enumMap.ObjectMap = new EnumMap (members, isFlags);
\r
1289 enumMap.IsSimpleType = true;
\r
1293 if (stype.Content is XmlSchemaSimpleTypeList)
\r
1295 XmlSchemaSimpleTypeList slist = (XmlSchemaSimpleTypeList)stype.Content;
\r
1296 TypeData arrayTypeData = FindBuiltInType (slist.ItemTypeName, stype);
\r
1298 ListMap listMap = new ListMap ();
\r
1300 listMap.ItemInfo = new XmlTypeMapElementInfoList ();
\r
1301 listMap.ItemInfo.Add (CreateElementInfo (typeQName.Namespace, null, "Item", arrayTypeData.ListItemTypeData, false, XmlSchemaForm.None));
\r
1303 XmlTypeMapping map = CreateArrayTypeMapping (typeQName, arrayTypeData);
\r
1304 map.ObjectMap = listMap;
\r
1305 map.IsSimpleType = true;
\r
1309 // It is an extension of a primitive or known type
\r
1311 TypeData typeData = FindBuiltInType (typeQName, stype);
\r
1312 return GetTypeMapping (typeData);
\r
1315 bool CanBeEnum (XmlSchemaSimpleType stype)
\r
1317 if (stype.Content is XmlSchemaSimpleTypeRestriction)
\r
1319 XmlSchemaSimpleTypeRestriction rest = (XmlSchemaSimpleTypeRestriction)stype.Content;
\r
1320 if (rest.Facets.Count == 0) return false;
\r
1321 foreach (object ob in rest.Facets)
\r
1322 if (!(ob is XmlSchemaEnumerationFacet)) return false;
\r
1325 else if (stype.Content is XmlSchemaSimpleTypeList)
\r
1327 XmlSchemaSimpleTypeList list = (XmlSchemaSimpleTypeList) stype.Content;
\r
1328 return (list.ItemType != null && CanBeEnum (list.ItemType));
\r
1333 bool CanBeArray (XmlQualifiedName typeQName, XmlSchemaComplexType stype)
\r
1335 if (encodedFormat)
\r
1337 XmlSchemaComplexContent content = stype.ContentModel as XmlSchemaComplexContent;
\r
1338 if (content == null) return false;
\r
1339 XmlSchemaComplexContentRestriction rest = content.Content as XmlSchemaComplexContentRestriction;
\r
1340 if (rest == null) return false;
\r
1341 return rest.BaseTypeName == arrayType;
\r
1345 if (stype.Attributes.Count > 0 || stype.AnyAttribute != null) return false;
\r
1346 else return !stype.IsMixed && CanBeArray (typeQName, stype.Particle, false);
\r
1350 bool CanBeArray (XmlQualifiedName typeQName, XmlSchemaParticle particle, bool multiValue)
\r
1352 // To be an array, there can't be a direct child of type typeQName
\r
1354 if (particle == null) return false;
\r
1356 multiValue = multiValue || particle.MaxOccurs > 1;
\r
1358 if (particle is XmlSchemaGroupRef)
\r
1359 return CanBeArray (typeQName, GetRefGroupParticle ((XmlSchemaGroupRef)particle), multiValue);
\r
1361 if (particle is XmlSchemaElement)
\r
1363 XmlSchemaElement elem = (XmlSchemaElement)particle;
\r
1364 if (!elem.RefName.IsEmpty)
\r
1365 return CanBeArray (typeQName, FindRefElement (elem), multiValue);
\r
1367 return multiValue && !typeQName.Equals (((XmlSchemaElement)particle).SchemaTypeName);
\r
1370 if (particle is XmlSchemaAny)
\r
1371 return multiValue;
\r
1373 if (particle is XmlSchemaSequence)
\r
1375 XmlSchemaSequence seq = particle as XmlSchemaSequence;
\r
1376 if (seq.Items.Count != 1) return false;
\r
1377 return CanBeArray (typeQName, (XmlSchemaParticle)seq.Items[0], multiValue);
\r
1380 if (particle is XmlSchemaChoice)
\r
1382 // Can be array if all choices have different types
\r
1383 ArrayList types = new ArrayList ();
\r
1384 if(!CheckChoiceType (typeQName, particle, types, ref multiValue)) return false;
\r
1385 return multiValue;
\r
1391 bool CheckChoiceType (XmlQualifiedName typeQName, XmlSchemaParticle particle, ArrayList types, ref bool multiValue)
\r
1393 XmlQualifiedName type = null;
\r
1395 multiValue = multiValue || particle.MaxOccurs > 1;
\r
1397 if (particle is XmlSchemaGroupRef)
\r
1398 return CheckChoiceType (typeQName, GetRefGroupParticle ((XmlSchemaGroupRef)particle), types, ref multiValue);
\r
1400 if (particle is XmlSchemaElement) {
\r
1402 XmlSchemaElement elem = (XmlSchemaElement)particle;
\r
1403 XmlSchemaElement refElem = GetRefElement (typeQName, elem, out ns);
\r
1404 if (refElem.SchemaType != null) return true;
\r
1405 type = refElem.SchemaTypeName;
\r
1407 else if (particle is XmlSchemaAny) {
\r
1410 else if (particle is XmlSchemaSequence)
\r
1412 XmlSchemaSequence seq = particle as XmlSchemaSequence;
\r
1413 foreach (XmlSchemaParticle par in seq.Items)
\r
1414 if (!CheckChoiceType (typeQName, par, types, ref multiValue)) return false;
\r
1417 else if (particle is XmlSchemaChoice)
\r
1419 foreach (XmlSchemaParticle choice in ((XmlSchemaChoice)particle).Items)
\r
1420 if (!CheckChoiceType (typeQName, choice, types, ref multiValue)) return false;
\r
1424 if (typeQName.Equals (type)) return false;
\r
1426 // For primitive types, compare using CLR types, since several
\r
1427 // xml types can be mapped to a single CLR type
\r
1430 if (IsPrimitiveTypeNamespace (type.Namespace))
\r
1431 t = TypeTranslator.GetPrimitiveTypeData (type.Name).FullTypeName + ":" + type.Namespace;
\r
1434 t = type.Name + ":" + type.Namespace;
\r
1436 if (types.Contains (t)) return false;
\r
1441 bool CanBeAnyElement (XmlSchemaComplexType stype)
\r
1443 XmlSchemaSequence seq = stype.Particle as XmlSchemaSequence;
\r
1444 return (seq != null) && (seq.Items.Count == 1) && (seq.Items[0] is XmlSchemaAny);
\r
1447 Type GetAnyElementType (XmlSchemaComplexType stype)
\r
1449 XmlSchemaSequence seq = stype.Particle as XmlSchemaSequence;
\r
1451 if ((seq == null) || (seq.Items.Count != 1) || !(seq.Items[0] is XmlSchemaAny))
\r
1454 if (encodedFormat)
\r
1455 return typeof(object);
\r
1457 XmlSchemaAny any = seq.Items[0] as XmlSchemaAny;
\r
1458 if (any.MaxOccurs == 1)
\r
1460 if (stype.IsMixed)
\r
1461 return typeof(XmlNode);
\r
1463 return typeof(XmlElement);
\r
1467 if (stype.IsMixed)
\r
1468 return typeof(XmlNode[]);
\r
1470 return typeof(XmlElement[]);
\r
1474 bool CanBeIXmlSerializable (XmlSchemaComplexType stype)
\r
1476 XmlSchemaSequence seq = stype.Particle as XmlSchemaSequence;
\r
1477 if (seq == null) return false;
\r
1478 if (seq.Items.Count != 2) return false;
\r
1479 XmlSchemaElement elem = seq.Items[0] as XmlSchemaElement;
\r
1480 if (elem == null) return false;
\r
1481 if (elem.RefName != new XmlQualifiedName ("schema",XmlSchema.Namespace)) return false;
\r
1482 return (seq.Items[1] is XmlSchemaAny);
\r
1485 XmlTypeMapping ImportXmlSerializableMapping (string ns)
\r
1487 XmlQualifiedName qname = new XmlQualifiedName ("System.Data.DataSet",ns);
\r
1488 XmlTypeMapping map = mappedTypes [qname] as XmlTypeMapping;
\r
1489 if (map != null) return map;
\r
1491 TypeData typeData = new TypeData ("System.Data.DataSet", "System.Data.DataSet", "System.Data.DataSet", SchemaTypes.XmlSerializable, null);
\r
1492 map = new XmlTypeMapping ("System.Data.DataSet", "", typeData, "System.Data.DataSet", ns);
\r
1493 map.IncludeInSchema = true;
\r
1494 mappedTypes [qname] = map;
\r
1495 dataMappedTypes [typeData] = map;
\r
1499 XmlTypeMapElementInfo CreateElementInfo (string ns, XmlTypeMapMember member, string name, TypeData typeData, bool isNillable, XmlSchemaForm form)
\r
1501 if (typeData.IsComplexType)
\r
1502 return CreateElementInfo (ns, member, name, typeData, isNillable, form, GetTypeMapping (typeData));
\r
1504 return CreateElementInfo (ns, member, name, typeData, isNillable, form, null);
\r
1507 XmlTypeMapElementInfo CreateElementInfo (string ns, XmlTypeMapMember member, string name, TypeData typeData, bool isNillable, XmlSchemaForm form, XmlTypeMapping emap)
\r
1509 XmlTypeMapElementInfo einfo = new XmlTypeMapElementInfo (member, typeData);
\r
1510 einfo.ElementName = name;
\r
1511 einfo.Namespace = ns;
\r
1512 einfo.IsNullable = isNillable;
\r
1513 einfo.Form = form;
\r
1514 if (typeData.IsComplexType)
\r
1515 einfo.MappedType = emap;
\r
1519 XmlTypeMapElementInfo CreateTextElementInfo (string ns, XmlTypeMapMember member, TypeData typeData)
\r
1521 XmlTypeMapElementInfo einfo = new XmlTypeMapElementInfo (member, typeData);
\r
1522 einfo.IsTextElement = true;
\r
1523 einfo.WrappedElement = false;
\r
1524 if (typeData.IsComplexType)
\r
1525 einfo.MappedType = GetTypeMapping (typeData);
\r
1529 XmlTypeMapping CreateTypeMapping (XmlQualifiedName typeQName, SchemaTypes schemaType, XmlQualifiedName root)
\r
1531 string typeName = CodeIdentifier.MakeValid (typeQName.Name);
\r
1532 typeName = typeIdentifiers.AddUnique (typeName, null);
\r
1534 TypeData typeData = new TypeData (typeName, typeName, typeName, schemaType, null);
\r
1538 if (root != null) {
\r
1539 rootElem = root.Name;
\r
1540 rootNs = root.Namespace;
\r
1543 rootElem = typeQName.Name;
\r
1547 XmlTypeMapping map = new XmlTypeMapping (rootElem, rootNs, typeData, typeQName.Name, typeQName.Namespace);
\r
1548 map.IncludeInSchema = true;
\r
1549 mappedTypes [typeQName] = map;
\r
1550 dataMappedTypes [typeData] = map;
\r
1555 XmlTypeMapping CreateArrayTypeMapping (XmlQualifiedName typeQName, TypeData arrayTypeData)
\r
1557 XmlTypeMapping map;
\r
1558 if (encodedFormat) map = new XmlTypeMapping ("Array", XmlSerializer.EncodingNamespace, arrayTypeData, "Array", XmlSerializer.EncodingNamespace);
\r
1559 else map = new XmlTypeMapping (arrayTypeData.XmlType, typeQName.Namespace, arrayTypeData, arrayTypeData.XmlType, typeQName.Namespace);
\r
1561 map.IncludeInSchema = true;
\r
1562 mappedTypes [typeQName] = map;
\r
1563 dataMappedTypes [arrayTypeData] = map;
\r
1568 XmlSchemaElement GetRefElement (XmlQualifiedName typeQName, XmlSchemaElement elem, out string ns)
\r
1571 if (!elem.RefName.IsEmpty)
\r
1573 ns = elem.RefName.Namespace;
\r
1574 return FindRefElement (elem);
\r
1578 ns = typeQName.Namespace;
\r
1583 XmlSchemaAttribute GetRefAttribute (XmlQualifiedName typeQName, XmlSchemaAttribute attr, out string ns)
\r
1585 if (!attr.RefName.IsEmpty)
\r
1587 ns = attr.RefName.Namespace;
\r
1588 XmlSchemaAttribute at = FindRefAttribute (attr.RefName);
\r
1589 if (at == null) throw new InvalidOperationException ("The attribute " + attr.RefName + " is missing");
\r
1594 ns = typeQName.Namespace;
\r
1599 TypeData GetElementTypeData (XmlQualifiedName typeQName, XmlSchemaElement elem, XmlQualifiedName root, out XmlTypeMapping map)
\r
1601 bool sharedAnnType = false;
\r
1604 if (!elem.RefName.IsEmpty) {
\r
1605 XmlSchemaElement refElem = FindRefElement (elem);
\r
1606 if (refElem == null) throw new InvalidOperationException ("Global element not found: " + elem.RefName);
\r
1607 root = elem.RefName;
\r
1609 sharedAnnType = true;
\r
1613 if (!elem.SchemaTypeName.IsEmpty) {
\r
1614 td = GetTypeData (elem.SchemaTypeName, root);
\r
1615 map = GetRegisteredTypeMapping (elem.SchemaTypeName);
\r
1617 else if (elem.SchemaType == null)
\r
1618 td = TypeTranslator.GetTypeData (typeof(object));
\r
1620 td = GetTypeData (elem.SchemaType, typeQName, elem.Name, sharedAnnType, root);
\r
1622 if (map == null && td.IsComplexType)
\r
1623 map = GetTypeMapping (td);
\r
1628 TypeData GetAttributeTypeData (XmlQualifiedName typeQName, XmlSchemaAttribute attr)
\r
1630 bool sharedAnnType = false;
\r
1632 if (!attr.RefName.IsEmpty) {
\r
1633 XmlSchemaAttribute refAtt = FindRefAttribute (attr.RefName);
\r
1634 if (refAtt == null) throw new InvalidOperationException ("Global attribute not found: " + attr.RefName);
\r
1636 sharedAnnType = true;
\r
1639 if (!attr.SchemaTypeName.IsEmpty) return GetTypeData (attr.SchemaTypeName, null);
\r
1640 if (attr.SchemaType == null) return TypeTranslator.GetTypeData (typeof(string));
\r
1641 else return GetTypeData (attr.SchemaType, typeQName, attr.Name, sharedAnnType, null);
\r
1644 TypeData GetTypeData (XmlQualifiedName typeQName, XmlQualifiedName root)
\r
1646 if (IsPrimitiveTypeNamespace (typeQName.Namespace)) {
\r
1647 XmlTypeMapping map = ImportType (typeQName, root, false);
\r
1648 if (map != null) return map.TypeData;
\r
1649 else return TypeTranslator.GetPrimitiveTypeData (typeQName.Name);
\r
1652 if (encodedFormat && typeQName.Namespace == "")
\r
1653 return TypeTranslator.GetPrimitiveTypeData (typeQName.Name);
\r
1655 return ImportType (typeQName, root, true).TypeData;
\r
1658 TypeData GetTypeData (XmlSchemaType stype, XmlQualifiedName typeQNname, string propertyName, bool sharedAnnType, XmlQualifiedName root)
\r
1662 if (sharedAnnType)
\r
1664 // Anonymous types defined in root elements or attributes can be shared among all elements that
\r
1665 // reference this root element or attribute
\r
1666 TypeData std = sharedAnonymousTypes [stype] as TypeData;
\r
1667 if (std != null) return std;
\r
1668 baseName = propertyName;
\r
1671 baseName = typeQNname.Name + typeIdentifiers.MakeRightCase (propertyName);
\r
1673 baseName = elemIdentifiers.AddUnique (baseName, stype);
\r
1675 XmlQualifiedName newName;
\r
1676 newName = new XmlQualifiedName (baseName, typeQNname.Namespace);
\r
1678 XmlTypeMapping map = ImportType (newName, stype, root);
\r
1679 if (sharedAnnType) sharedAnonymousTypes [stype] = map.TypeData;
\r
1681 return map.TypeData;
\r
1684 XmlTypeMapping GetTypeMapping (TypeData typeData)
\r
1686 if (typeData.Type == typeof(object) && !anyTypeImported)
\r
1687 ImportAllObjectTypes ();
\r
1689 XmlTypeMapping map = (XmlTypeMapping) dataMappedTypes [typeData];
\r
1690 if (map != null) return map;
\r
1692 if (typeData.IsListType)
\r
1694 // Create an array map for the type
\r
1696 XmlTypeMapping itemMap = GetTypeMapping (typeData.ListItemTypeData);
\r
1698 map = new XmlTypeMapping (typeData.XmlType, itemMap.Namespace, typeData, typeData.XmlType, itemMap.Namespace);
\r
1699 map.IncludeInSchema = true;
\r
1701 ListMap listMap = new ListMap ();
\r
1702 listMap.ItemInfo = new XmlTypeMapElementInfoList();
\r
1703 listMap.ItemInfo.Add (CreateElementInfo (itemMap.Namespace, null, typeData.ListItemTypeData.XmlType, typeData.ListItemTypeData, false, XmlSchemaForm.None));
\r
1704 map.ObjectMap = listMap;
\r
1706 mappedTypes [new XmlQualifiedName(map.ElementName, map.Namespace)] = map;
\r
1707 dataMappedTypes [typeData] = map;
\r
1710 else if (typeData.SchemaType == SchemaTypes.Primitive || typeData.Type == typeof(object) || typeof(XmlNode).IsAssignableFrom(typeData.Type))
\r
1712 return CreateSystemMap (typeData);
\r
1715 throw new InvalidOperationException ("Map for type " + typeData.TypeName + " not found");
\r
1718 void AddObjectDerivedMap (XmlTypeMapping map)
\r
1720 TypeData typeData = TypeTranslator.GetTypeData (typeof(object));
\r
1721 XmlTypeMapping omap = (XmlTypeMapping) dataMappedTypes [typeData];
\r
1723 omap = CreateSystemMap (typeData);
\r
1724 omap.DerivedTypes.Add (map);
\r
1727 XmlTypeMapping CreateSystemMap (TypeData typeData)
\r
1729 XmlTypeMapping map = new XmlTypeMapping (typeData.XmlType, XmlSchema.Namespace, typeData, typeData.XmlType, XmlSchema.Namespace);
\r
1730 map.IncludeInSchema = false;
\r
1731 map.ObjectMap = new ClassMap ();
\r
1732 dataMappedTypes [typeData] = map;
\r
1736 void ImportAllObjectTypes ()
\r
1738 // All complex types are subtypes of anyType, so all of them
\r
1739 // must also be imported
\r
1741 anyTypeImported = true;
\r
1742 foreach (XmlSchema schema in schemas) {
\r
1743 foreach (XmlSchemaObject sob in schema.Items)
\r
1745 XmlSchemaComplexType sct = sob as XmlSchemaComplexType;
\r
1747 ImportType (new XmlQualifiedName (sct.Name, schema.TargetNamespace), sct, null);
\r
1753 XmlTypeMapping GetRegisteredTypeMapping (XmlQualifiedName typeQName)
\r
1755 return (XmlTypeMapping) mappedTypes [typeQName];
\r
1758 XmlSchemaParticle GetRefGroupParticle (XmlSchemaGroupRef refGroup)
\r
1760 XmlSchemaGroup grp = (XmlSchemaGroup) schemas.Find (refGroup.RefName, typeof (XmlSchemaGroup));
\r
1761 return grp.Particle;
\r
1764 XmlSchemaElement FindRefElement (XmlSchemaElement elem)
\r
1766 XmlSchemaElement refelem = (XmlSchemaElement) schemas.Find (elem.RefName, typeof(XmlSchemaElement));
\r
1767 if (refelem != null) return refelem;
\r
1769 if (IsPrimitiveTypeNamespace (elem.RefName.Namespace))
\r
1771 if (anyElement != null) return anyElement;
\r
1772 anyElement = new XmlSchemaElement ();
\r
1773 anyElement.Name = "any";
\r
1774 anyElement.SchemaTypeName = anyType;
\r
1775 return anyElement;
\r
1780 XmlSchemaAttribute FindRefAttribute (XmlQualifiedName refName)
\r
1782 if (refName.Namespace == XmlNamespace)
\r
1784 XmlSchemaAttribute at = new XmlSchemaAttribute ();
\r
1785 at.Name = refName.Name;
\r
1786 at.SchemaTypeName = new XmlQualifiedName ("string",XmlSchema.Namespace);
\r
1789 return (XmlSchemaAttribute) schemas.Find (refName, typeof(XmlSchemaAttribute));
\r
1792 XmlSchemaAttributeGroup FindRefAttributeGroup (XmlQualifiedName refName)
\r
1794 XmlSchemaAttributeGroup grp = (XmlSchemaAttributeGroup) schemas.Find (refName, typeof(XmlSchemaAttributeGroup));
\r
1795 foreach (XmlSchemaObject at in grp.Attributes)
\r
1797 if (at is XmlSchemaAttributeGroupRef && ((XmlSchemaAttributeGroupRef)at).RefName == refName)
\r
1798 throw new InvalidOperationException ("Cannot import attribute group '" + refName.Name + "' from namespace '" + refName.Namespace + "'. Redefine not supported");
\r
1804 XmlTypeMapping ReflectType (Type type)
\r
1806 TypeData typeData = TypeTranslator.GetTypeData (type);
\r
1807 return ReflectType (typeData, (string) null);
\r
1810 XmlTypeMapping ReflectType (TypeData typeData, string ns)
\r
1812 if (!encodedFormat)
\r
1814 if (auxXmlRefImporter == null) auxXmlRefImporter = new XmlReflectionImporter ();
\r
1815 return auxXmlRefImporter.ImportTypeMapping (typeData, ns);
\r
1819 if (auxSoapRefImporter == null) auxSoapRefImporter = new SoapReflectionImporter ();
\r
1820 return auxSoapRefImporter.ImportTypeMapping (typeData, ns);
\r
1825 string GetDocumentation (XmlSchemaAnnotated elem)
\r
1828 XmlSchemaAnnotation anot = elem.Annotation;
\r
1829 if (anot == null || anot.Items == null) return null;
\r
1831 foreach (object ob in anot.Items)
\r
1833 XmlSchemaDocumentation doc = ob as XmlSchemaDocumentation;
\r
1834 if (doc != null && doc.Markup != null && doc.Markup.Length > 0) {
\r
1835 if (res != string.Empty) res += "\n";
\r
1836 foreach (XmlNode node in doc.Markup)
\r
1837 res += node.Value;
\r
1843 bool IsPrimitiveTypeNamespace (string ns)
\r
1845 return (ns == XmlSchema.Namespace) || (encodedFormat && ns == XmlSerializer.EncodingNamespace);
\r
1848 #endregion // Methods
\r