Example #1
0
        public static bool TryAddSchemaTypeFromXmlSchemaProviderAttribute(this XmlDictionaryWriter writer, Type type, string name, SoapSerializer serializer, XmlNamespaceManager xmlNamespaceManager = null)
        {
            if (!useXmlSchemaProvider && !useXmlReflectionImporter)
            {
                return(false);
            }

            if (useXmlReflectionImporter)
            {
                var schemas     = new XmlSchemas();
                var xmlImporter = new XmlReflectionImporter();
                var exporter    = new XmlSchemaExporter(schemas);

                var xmlTypeMapping = xmlImporter.ImportTypeMapping(type, new XmlRootAttribute()
                {
                    ElementName = name
                });
                exporter.ExportTypeMapping(xmlTypeMapping);
                schemas.Compile(null, true);

                var memoryStream = new MemoryStream();
                foreach (XmlSchema schema in schemas)
                {
                    schema.Write(memoryStream);
                }
                memoryStream.Position = 0;

                var streamReader = new StreamReader(memoryStream);
                var result       = streamReader.ReadToEnd();

                var doc = new XmlDocument();
                doc.LoadXml(result);
                doc.DocumentElement.WriteContentTo(writer);

                return(true);
            }

            var xmlSchemaSet = xmlNamespaceManager == null ? new XmlSchemaSet() : new XmlSchemaSet(xmlNamespaceManager.NameTable);
            var xmlSchemaProviderAttribute = type.GetCustomAttribute <XmlSchemaProviderAttribute>(true);

            if (xmlSchemaProviderAttribute != null && true)
            {
                XmlSchema schema = new XmlSchema();
                if (xmlNamespaceManager != null)
                {
                    schema.Namespaces = xmlNamespaceManager.Convert();
                }
                if (xmlSchemaProviderAttribute.IsAny)
                {
                    //MetaWCFBodyWriter usage....
                    //writer.WriteAttributeString("name", name);
                    //writer.WriteAttributeString("nillable", "true");
                    //writer.WriteStartElement("xs", "complexType", Namespaces.XMLNS_XSD);
                    //writer.WriteStartElement("xs", "sequence", Namespaces.XMLNS_XSD);
                    //writer.WriteStartElement("xs", "any", Namespaces.XMLNS_XSD);
                    //writer.WriteAttributeString("minOccurs", "0");
                    //writer.WriteAttributeString("processContents", "lax");
                    //writer.WriteEndElement();
                    //writer.WriteEndElement();
                    //writer.WriteEndElement();
                    var sequence = new XmlSchemaSequence();
                    sequence.Items.Add(new XmlSchemaAny()
                    {
                        ProcessContents = XmlSchemaContentProcessing.Lax
                    });
                    var complex = new XmlSchemaComplexType()
                    {
                        Particle = sequence
                    };
                    var element = new XmlSchemaElement()
                    {
                        MinOccurs  = 0,
                        MaxOccurs  = 1,
                        Name       = name,
                        IsNillable = serializer == SoapSerializer.DataContractSerializer ? true : false,
                        SchemaType = complex
                    };
                    schema.Items.Add(element);
                }
                else
                {
                    var methodInfo    = type.GetMethod(xmlSchemaProviderAttribute.MethodName, BindingFlags.Static | BindingFlags.Public);
                    var xmlSchemaType = (XmlSchemaType)methodInfo.Invoke(null, new object[] { xmlSchemaSet });
                    var element       = new XmlSchemaElement()
                    {
                        MinOccurs  = 0,
                        MaxOccurs  = 1,
                        Name       = name,
                        SchemaType = xmlSchemaType
                    };
                    schema.Items.Add(element);
                }

                var memoryStream = new MemoryStream();
                schema.Write(memoryStream);
                memoryStream.Position = 0;

                var streamReader = new StreamReader(memoryStream);
                var result       = streamReader.ReadToEnd();

                var doc = new XmlDocument();
                doc.LoadXml(result);
                doc.DocumentElement.WriteContentTo(writer);

                return(true);
            }

            return(false);
        }