private ComplexTypeInfo ParseComplexParticle(XmlSchemaParticle particle) { var complexTypeInfo = new ComplexTypeInfo(); var sequence = particle as XmlSchemaSequence; var choice = particle as XmlSchemaChoice; var all = particle as XmlSchemaAll; if (sequence != null) { for (var i = 0; i < sequence.Items.Count; i++) { var childElement = sequence.Items[i] as XmlSchemaElement; var innerSequence = sequence.Items[i] as XmlSchemaSequence; var innerChoice = sequence.Items[i] as XmlSchemaChoice; var innerAll = sequence.Items[i] as XmlSchemaAll; if (childElement != null) { var parameter = new Parameter(name: childElement.Name, type: childElement.SchemaTypeName.Name); if (childElement.QualifiedName != null) { parameter.Namespace = childElement.QualifiedName.Namespace; } complexTypeInfo.Properties.Add(parameter); } else { this.ParseComplexParticle(sequence.Items[i] as XmlSchemaParticle); } } } else if (choice != null) { for (var i = 0; i < choice.Items.Count; i++) { var childElement = choice.Items[i] as XmlSchemaElement; var innerSequence = choice.Items[i] as XmlSchemaSequence; var innerChoice = choice.Items[i] as XmlSchemaChoice; var innerAll = choice.Items[i] as XmlSchemaAll; if (childElement != null) { complexTypeInfo.Properties.Add(new Parameter(name: childElement.Name, type: childElement.SchemaTypeName.Name)); } else { this.ParseComplexParticle(choice.Items[i] as XmlSchemaParticle); } } } else if (all != null) { for (var i = 0; i < all.Items.Count; i++) { var childElement = all.Items[i] as XmlSchemaElement; var innerSequence = all.Items[i] as XmlSchemaSequence; var innerChoice = all.Items[i] as XmlSchemaChoice; var innerAll = all.Items[i] as XmlSchemaAll; if (childElement != null) { complexTypeInfo.Properties.Add(new Parameter(name: childElement.Name, type: childElement.SchemaTypeName.Name)); } else { this.ParseComplexParticle(all.Items[i] as XmlSchemaParticle); } } } return(complexTypeInfo); }
private List <Parameter> GetParametersFromSchema(XmlSchema xmlSchema, string messagePartName) { var parameters = new List <Parameter>(); // Complex types foreach (XmlSchemaObject item in xmlSchema.Items) { var schemaElement = item as XmlSchemaElement; var complexType = item as XmlSchemaComplexType; if (schemaElement != null) { if (schemaElement.Name == messagePartName) { var schemaComplexType = schemaElement.SchemaType as XmlSchemaComplexType; if (schemaComplexType != null) { var particle = schemaComplexType.Particle; var sequence = particle as XmlSchemaSequence; if (sequence != null) { foreach (XmlSchemaElement childElement in sequence.Items) { var parameterName = childElement.Name; var parameterType = childElement.SchemaTypeName.Name; parameters.Add(new Parameter(parameterName, parameterType)); } } } } } else if (complexType != null) { ComplexTypeInfo complexTypeInfo = null; if (complexType.Particle != null) { complexTypeInfo = this.ParseComplexParticle(complexType.Particle); complexTypeInfo.Name = complexType.Name; } else { if (complexType.ContentModel != null && complexType.ContentModel.Content != null && ((XmlSchemaComplexContentExtension)(complexType.ContentModel.Content)).Particle != null) { complexTypeInfo = this.ParseComplexParticle(((XmlSchemaComplexContentExtension)(complexType.ContentModel.Content)).Particle); complexTypeInfo.Name = complexType.Name; } } if (complexTypeInfo != null && !this.ComplexTypes.Any(x => x.Name == complexTypeInfo.Name)) { this.ComplexTypes.Add(complexTypeInfo); } } } // Schema elements (referencing to complex types) e.g. <xs:element name="processShoppingCart" type="tns:processShoppingCart" /> foreach (object item in xmlSchema.Items) { var schemaElement = item as XmlSchemaElement; if (schemaElement != null) { if (schemaElement.Name == messagePartName) { if (schemaElement.SchemaTypeName != null && !string.IsNullOrEmpty(schemaElement.SchemaTypeName.Name)) { // search the complex type and add the parameters of them var complexType = this.ComplexTypes.First(x => x.Name == schemaElement.SchemaTypeName.Name); if (complexType != null) { parameters.AddRange(complexType.Properties); } } } } } // Includes if (xmlSchema.Includes != null) { foreach (var schemaImport in xmlSchema.Includes) { if (schemaImport is XmlSchemaImport) { if ((schemaImport as XmlSchemaImport).Schema != null) { parameters.AddRange(this.GetParametersFromSchema((schemaImport as XmlSchemaImport).Schema, messagePartName)); } } else if (schemaImport is XmlSchemaInclude) { var schemaInclude = (schemaImport as XmlSchemaInclude); if (schemaInclude.SchemaLocation != null && schemaInclude.Schema == null) { var includeSchema = this.LoadSchema(schemaInclude.SchemaLocation); includeSchema.TargetNamespace = xmlSchema.TargetNamespace; schemaInclude.Schema = includeSchema; } if (schemaInclude.Schema != null) { parameters.AddRange(this.GetParametersFromSchema(schemaInclude.Schema, messagePartName)); } } } } return(parameters); }