Пример #1
0
        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);
        }
Пример #2
0
        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);
        }