Exemplo n.º 1
0
 private void AddNamespaceMapping(XmlNamespaceContext namespaceContext, XmlWriterImpl xmlWriter, string prefix, string uri)
 {
     if (namespaceContext.LookupPrefix(uri) == ValueFactory.Create())
     {
         xmlWriter.WriteNamespaceMapping(prefix, uri);
     }
 }
Exemplo n.º 2
0
        public void TestUnnamedComplexType()
        {
            var ss        = LoadSchema(@"TestData/Schema01.xsd");
            var f         = new XdtoFactory(ss);
            var t         = f.Type(uri: "unnamedComplexType", name: "TheComplexType") as XdtoObjectType;
            var v         = f.Create(t) as XdtoDataObject;
            var p         = t.Properties.Get("Element");
            var pv        = f.Create(p.Type) as XdtoDataObject;
            var var1Value = f.Create(f.Type(XmlNs.xs, "string"), ValueFactory.Create("value of var1"));

            pv.Set("var1", ValueFactory.Create(var1Value));

            v.Set("Element", pv);

            var w = new XmlWriterImpl();

            w.SetString();

            f.WriteXml(w, v, "value");

            var serialized = w.Close().AsString();

            Console.WriteLine(serialized);

            var r = new XmlReaderImpl();

            r.SetString(serialized);

            var checkObject = f.ReadXml(r) as XdtoDataObject;
            var checkValue  = (checkObject.Get("Element") as XdtoDataObject).Get("var1").AsString();

            Console.WriteLine($"got {checkValue}");
        }
Exemplo n.º 3
0
        public string Handle(string requestBody)
        {
            var reader = new XmlReaderImpl();

            reader.SetString(requestBody);

            var writer = new XmlWriterImpl();

            writer.SetString();

            writer.WriteStartElement("Envelope", xmlns_soap);
            writer.WriteNamespaceMapping("soap", xmlns_soap);
            writer.WriteStartElement("Body", xmlns_soap);

            try
            {
                Handle(reader, writer);
            }
            catch (Exception exc)
            {
                WriteFault(writer, exc.Message);
            }

            writer.WriteEndElement();              // Body
            writer.WriteEndElement();              // Envelope

            var responseText = writer.Close().AsString();

            return(responseText);
        }
Exemplo n.º 4
0
        public void WriteRequestBody(XmlWriterImpl writer,
                                     XdtoSerializerImpl serializer,
                                     IValue [] arguments)
        {
            foreach (var messagePart in Parameters.Parts)
            {
                writer.WriteStartElement(messagePart.ElementName, messagePart.NamespaceUri);

                foreach (var param in messagePart.Parameters)
                {
                    if (param.ParameterDirection == ParameterDirectionEnum.Out)
                    {
                        continue;
                    }

                    var argumentIndex  = _indexes [param.Name];
                    var typeAssignment = XmlTypeAssignmentEnum.Implicit;

                    if (param.Type is XdtoValueType)
                    {
                        typeAssignment = XmlTypeAssignmentEnum.Explicit;
                    }
                    serializer.WriteXml(writer, arguments [argumentIndex], param.Name, messagePart.NamespaceUri, typeAssignment);
                }

                writer.WriteEndElement();                  // messagePart.ElementName
            }
        }
Exemplo n.º 5
0
        public void WriteXML(XmlWriterImpl xmlWriter,
                             IValue value,
                             string name,
                             XMLTypeAssignment typeAssigment = XMLTypeAssignment.Implicit,
                             XMLForm form = XMLForm.Element)
        {
            XMLExpandedName xmlType;

            switch (value.DataType)
            {
            case DataType.Undefined:

                WriteXMLUndefined(xmlWriter, name, form);
                break;

            case DataType.String:

                xmlType = new XMLExpandedName(XmlSchema.InstanceNamespace, "string");
                WriteXMLSimpleData(xmlWriter, name, value, xmlType, typeAssigment, form);
                break;

            case DataType.Number:

                xmlType = new XMLExpandedName(XmlSchema.InstanceNamespace, "decimal");
                WriteXMLSimpleData(xmlWriter, name, value, xmlType, typeAssigment, form);
                break;

            case DataType.Boolean:

                xmlType = new XMLExpandedName(XmlSchema.InstanceNamespace, "boolean");
                WriteXMLSimpleData(xmlWriter, name, value, xmlType, typeAssigment, form);
                break;

            case DataType.Date:

                xmlType = new XMLExpandedName(XmlSchema.InstanceNamespace, "dateTime");
                WriteXMLSimpleData(xmlWriter, name, value, xmlType, typeAssigment, form);
                break;

            case DataType.Object:

                IRuntimeContextInstance valueObject = value.AsObject();
                if (valueObject is IXDTOSerializableXML seriazable)
                {
                    seriazable.WriteXML(xmlWriter, this);
                }
                else
                {
                    throw RuntimeException.InvalidArgumentType();
                }
                break;

            default:
                throw RuntimeException.InvalidArgumentType();
            }
        }
Exemplo n.º 6
0
        private void WriteFault(XmlWriterImpl writer, string faultString)
        {
            writer.WriteStartElement("Fault", xmlns_soap);
            writer.WriteStartElement("faultString", xmlns_soap);

            writer.WriteText(faultString);

            writer.WriteEndElement();              // faultString
            writer.WriteEndElement();              // Fault
        }
Exemplo n.º 7
0
        public void Handle(XmlReaderImpl requestReader,
                           XmlWriterImpl responseWriter)
        {
            var F            = new XdtoFactory();
            var S            = XdtoSerializerImpl.Constructor(ValueFactory.Create(F)) as XdtoSerializerImpl;
            var inputMessage = F.ReadXml(requestReader) as XdtoDataObject;
            var body         = inputMessage.Get("Body") as XdtoDataObject;

            var requestProperty = body.Properties().Get(0);
            var methodName      = requestProperty.LocalName;

            if (!operations.ContainsKey(methodName))
            {
                // TODO: SoapException
                throw new RuntimeException($"method not found {methodName}");
            }

            var op = operations[methodName];

            // TODO: отдать разбор в операцию
            var args       = new List <IValue>();
            var callParams = body.Get(body.Properties().Get(0)) as XdtoDataObject;

            foreach (var pv in callParams.Properties())
            {
                var paramName = pv.LocalName;
                var p         = op.Parameters.Get(paramName);
                var xdtoValue = callParams.GetXdto(pv);
                var ivalue    = S.ReadXdto(xdtoValue);

                if (p.ParameterDirection != ParameterDirectionEnum.In)
                {
                    ivalue = Variable.Create(ivalue, paramName);
                }
                args.Add(ivalue);
            }

            var    handler   = operationsMapper[op];
            var    methodIdx = handler.FindMethod(methodName);
            var    mi        = handler.GetMethodInfo(methodIdx);
            IValue result    = null;

            if (mi.IsFunction)
            {
                handler.CallAsFunction(methodIdx, args.ToArray(), out result);
            }
            else
            {
                handler.CallAsProcedure(methodIdx, args.ToArray());
            }

            op.WriteResponseBody(responseWriter, S, result, args.ToArray());
        }
Exemplo n.º 8
0
        public void WriteXml(XmlWriterImpl xmlWriter,
                             IXdtoValue value,
                             string localName,
                             string namespaceUri = null,
                             XmlTypeAssignmentEnum?typeAssignment = null,
                             XmlFormEnum?xmlForm = null)
        {
            xmlForm        = xmlForm ?? XmlFormEnum.Element;
            typeAssignment = typeAssignment ?? XmlTypeAssignmentEnum.Implicit;

            if (xmlForm == XmlFormEnum.Element)
            {
                xmlWriter.WriteStartElement(localName, namespaceUri);

                if (typeAssignment == XmlTypeAssignmentEnum.Implicit)
                {
                    WriteTypeAttribute(xmlWriter, ValueFactory.Create(value));
                }

                if (value == null)
                {
                    xmlWriter.WriteAttribute("nil", XmlNs.xsi, "true");
                }
                else if (value is XdtoDataObject)
                {
                    WriteXdtoObject(xmlWriter, value as XdtoDataObject);
                }
                else if (value is XdtoDataValue)
                {
                    var dataValue = value as XdtoDataValue;
                    xmlWriter.WriteText(dataValue.LexicalValue);
                }
                else
                {
                    xmlWriter.WriteText(value.ToString());
                }

                xmlWriter.WriteEndElement();
            }
            else if (xmlForm == XmlFormEnum.Attribute)
            {
                xmlWriter.WriteAttribute(localName, namespaceUri, value.ToString());
            }
            else if (xmlForm == XmlFormEnum.Text)
            {
                xmlWriter.WriteText(value.ToString());                   // TODO: XmlString ??
            }
            else
            {
                throw new NotSupportedException("Какой-то новый тип для XML");
            }
        }
Exemplo n.º 9
0
        public void WriteXml(XmlWriterImpl xmlWriter,
                             IValue value,
                             string localName,
                             string namespaceUri,
                             XmlTypeAssignmentEnum?typeAssignment = null,
                             XmlFormEnum?xmlForm = null)
        {
            xmlForm        = xmlForm ?? XmlFormEnum.Element;
            typeAssignment = typeAssignment ?? XmlTypeAssignmentEnum.Implicit;

            var xdtoValue = WriteXdto(value);

            XdtoFactory.WriteXml(xmlWriter, xdtoValue, localName, namespaceUri, typeAssignment, xmlForm);
        }
Exemplo n.º 10
0
        public void WriteXML(XmlWriterImpl xmlWriter,
                             IValue value,
                             XMLTypeAssignment typeAssigment = XMLTypeAssignment.Implicit,
                             XMLForm form = XMLForm.Element)
        {
            switch (value.DataType)
            {
            case DataType.Undefined:

                WriteXML(xmlWriter, value, "Undefined", typeAssigment, form);
                break;

            case DataType.String:

                WriteXML(xmlWriter, value, "string", typeAssigment, form);
                break;

            case DataType.Number:

                WriteXML(xmlWriter, value, "decimal", typeAssigment, form);
                break;

            case DataType.Boolean:

                WriteXML(xmlWriter, value, "boolean", typeAssigment, form);
                break;

            case DataType.Date:

                WriteXML(xmlWriter, value, "dateTime", typeAssigment, form);
                break;

            case DataType.Object:

                IRuntimeContextInstance valueObject = value.AsObject();
                if (valueObject is IXDTOSerializableXML seriazable)
                {
                    seriazable.WriteXML(xmlWriter, this);
                }
                else
                {
                    throw RuntimeException.InvalidArgumentType();
                }
                break;

            default:
                throw RuntimeException.InvalidArgumentType();
            }
        }
Exemplo n.º 11
0
        private void WriteXMLUndefined(XmlWriterImpl xmlWriter, string name, XMLForm form)
        {
            if (form == XMLForm.Element)
            {
                XmlNamespaceContext namespaceContext = xmlWriter.NamespaceContext;
                AddNamespaceMapping(namespaceContext, xmlWriter, "", XmlSchema.Namespace);
                AddNamespaceMapping(namespaceContext, xmlWriter, "xsi", XmlSchema.InstanceNamespace);

                xmlWriter.WriteStartElement(name);
                xmlWriter.WriteStartAttribute("nil", XmlSchema.InstanceNamespace);
                xmlWriter.WriteText("true");
                xmlWriter.WriteEndAttribute();
                xmlWriter.WriteEndElement();
            }
        }
Exemplo n.º 12
0
        private void WriteXMLSimpleData(XmlWriterImpl xmlWriter,
                                        string name,
                                        IValue value,
                                        XMLExpandedName type,
                                        XMLTypeAssignment typeAssigment,
                                        XMLForm form)
        {
            XmlNamespaceContext namespaceContext;
            string xmlValue = XMLString(value);

            switch (form)
            {
            case XMLForm.Attribute:
                namespaceContext = xmlWriter.NamespaceContext;
                AddNamespaceMapping(namespaceContext, xmlWriter, "", XmlSchema.Namespace);

                xmlWriter.WriteStartAttribute(name);
                xmlWriter.WriteText(xmlValue);
                xmlWriter.WriteEndAttribute();
                break;

            case XMLForm.Text:
                xmlWriter.WriteText(xmlValue);
                break;

            default:

                xmlWriter.WriteStartElement(name);

                namespaceContext = xmlWriter.NamespaceContext;
                AddNamespaceMapping(namespaceContext, xmlWriter, "", XmlSchema.Namespace);
                AddNamespaceMapping(namespaceContext, xmlWriter, "xsi", XmlSchema.InstanceNamespace);

                if (typeAssigment == XMLTypeAssignment.Explicit)
                {
                    xmlWriter.WriteStartAttribute("type", XmlSchema.InstanceNamespace);
                    xmlWriter.WriteText(type.LocalName);
                    xmlWriter.WriteEndAttribute();
                }

                xmlWriter.WriteText(xmlValue);

                xmlWriter.WriteEndElement();
                break;
            }
        }
Exemplo n.º 13
0
        public void TestRouter()
        {
            var router = new Router("OneService", "http://oscript.io/example/");

            router.AddHandler(new RouterTest());

            // Console.WriteLine(router.GenerateWsdl());

            var xmlBody = XmlWriterImpl.Create();

            xmlBody.SetString(ValueFactory.Create("UTF-8"));

            xmlBody.WriteStartElement("soap:Envelope");
            xmlBody.WriteNamespaceMapping("xsi", "http://www.w3.org/2001/XMLSchema-instance");
            xmlBody.WriteNamespaceMapping("xsd", "http://www.w3.org/2001/XMLSchema");
            xmlBody.WriteNamespaceMapping("soap", "http://schemas.xmlsoap.org/soap/envelope/");
            xmlBody.WriteNamespaceMapping("s", "http://oscript.io/example/");

            xmlBody.WriteStartElement("soap:Body");

            xmlBody.WriteStartElement("s:Sum");

            xmlBody.WriteStartElement("s:p0");
            xmlBody.WriteAttribute("xsi:type", "xsd:decimal");
            xmlBody.WriteText("1");
            xmlBody.WriteEndElement();              // s:p0

            xmlBody.WriteStartElement("s:p1");
            xmlBody.WriteAttribute("xsi:type", "xsd:decimal");
            xmlBody.WriteText("2");
            xmlBody.WriteEndElement();              // s:p1

            xmlBody.WriteEndElement();              // s:Sum

            xmlBody.WriteEndElement();              // soap:Body
            xmlBody.WriteEndElement();              // soap:Envelope

            var requestString = xmlBody.Close().ToString();

            Console.WriteLine(requestString);

            var responseString = router.Handle(requestString);

            Console.WriteLine(responseString);
        }
Exemplo n.º 14
0
        private void WriteXdtoObject(XmlWriterImpl xmlWriter,
                                     XdtoDataObject obj)
        {
            obj.Validate();

            if (obj.Type().Sequenced)
            {
                WriteXdtoSequence(xmlWriter, obj.Sequence());
                return;
            }

            foreach (var property in obj.Properties())
            {
                var typeAssignment = XmlTypeAssignmentEnum.Explicit;

                if (property.UpperBound != 1)
                {
                    // это список
                    var value = obj.GetList(property) as XdtoList;
                    foreach (var listElement in value)
                    {
                        WriteXml(xmlWriter, listElement,
                                 property.LocalName,
                                 property.NamespaceURI,
                                 typeAssignment,
                                 property.Form);
                    }
                }
                else
                {
                    var value = obj.GetXdto(property);
                    if (value != null || property.Nillable)
                    {
                        WriteXml(xmlWriter, value,
                                 property.LocalName,
                                 property.NamespaceURI,
                                 typeAssignment,
                                 property.Form);
                    }
                }
            }
        }
Exemplo n.º 15
0
        public static IWriter CreateWriter(TextWriter output, Format format)
        {
            switch (format)
            {
            case Format.Xml:
                var xws = new XmlWriterSettings {
                    ConformanceLevel = ConformanceLevel.Fragment
                };
                return(XmlWriterImpl.Create(output, xws));

#if FULL
            case Format.Json:
                return(JsonWriterImpl.Create(output));

            case Format.JsonML:
                return(JsonMLWriter.Create(output));
#endif
            default:
                throw new NotSupportedException("format");
            }
        }
Exemplo n.º 16
0
        // Особенности реализации: возвращаемое значение и исходящие параметры
        // передаём ОДНИМ сообщением, хотя протокол разрешает несколько сообщений

        public void WriteResponseBody(XmlWriterImpl writer,
                                      XdtoSerializerImpl serializer,
                                      IValue returnValue,
                                      IValue [] arguments)
        {
            writer.WriteStartElement(ReturnValue.MessagePartName, NamespaceUri);

            serializer.WriteXml(writer, returnValue, "return", NamespaceUri);
            foreach (var param in Parameters)
            {
                if (param.ParameterDirection == ParameterDirectionEnum.In)
                {
                    continue;
                }

                var argumentIndex = _indexes [param.Name];
                serializer.WriteXml(writer, arguments [argumentIndex], param.Name, NamespaceUri);
            }

            writer.WriteEndElement();              // messagePartName
        }
Exemplo n.º 17
0
 private void WriteXdtoSequence(XmlWriterImpl xmlWriter,
                                XdtoSequence sequence)
 {
     foreach (var element in sequence)
     {
         if (element == null)
         {
             // TODO: надо ли что-нибудь делать???
         }
         else if (element is XdtoSequenceStringElement)
         {
             xmlWriter.WriteText((element as XdtoSequenceStringElement).Text);
         }
         else if (element is XdtoSequenceValueElement)
         {
             var obj = element as XdtoSequenceValueElement;
             WriteXml(xmlWriter, obj.Value,
                      obj.Property.LocalName, obj.Property.NamespaceURI,
                      XmlTypeAssignmentEnum.Explicit,
                      obj.Property.Form);
         }
     }
 }
Exemplo n.º 18
0
        private void WriteTypeAttribute(XmlWriterImpl xmlWriter,
                                        IValue value)
        {
            string typeName;
            string typeUri;

            if (value is XdtoDataObject)
            {
                var obj = value as XdtoDataObject;
                typeUri  = obj.Type().NamespaceUri;
                typeName = obj.Type().Name;
            }
            else if (value is XdtoDataValue)
            {
                var obj = value as XdtoDataValue;
                typeUri  = obj.Type().NamespaceUri;
                typeName = obj.Type().Name;
            }
            else
            {
                typeName = "string";
                typeUri  = XmlNs.xs;
            }

            var ns = xmlWriter.LookupPrefix(typeUri)?.AsString();

            if (string.IsNullOrEmpty(ns))
            {
                // WriteAttribute(name, ns, value) при создании нового префикса
                //  не опознаёт префиксы, записанные через WriteNamespaceMapping
                var prefixIndex = xmlWriter.NamespaceContext.NamespaceMappings().Count() + 2;                   // TODO: Костыль с +2
                var prefixDepth = xmlWriter.NamespaceContext.Depth;
                ns = string.Format("d{0}p{1}", prefixDepth, prefixIndex);
                xmlWriter.WriteNamespaceMapping(ns, typeUri);
            }
            xmlWriter.WriteAttribute("type", XmlNs.xsi, string.Format("{0}:{1}", ns, typeName));
        }
Exemplo n.º 19
0
        public void TestXdto()
        {
            const string anyXml = @"<number>1</number>";
            var          reader = XmlReaderImpl.Create() as XmlReaderImpl;

            reader.SetString(anyXml);

            var factory      = XdtoFactory.Constructor() as XdtoFactory;
            var expectedType = factory.Type(new XmlDataType("int"));
            var anyValue     = factory.ReadXml(reader, expectedType) as XdtoDataValue;

            if (anyValue == null)
            {
                throw new Exception("XDTO не разобрался!");
            }

            var writer = XmlWriterImpl.Create() as XmlWriterImpl;

            writer.SetString();

            factory.WriteXml(writer, anyValue, "number");
            var serializedResult = writer.Close().AsString();

            Console.WriteLine("Original : {0}", anyXml);
            Console.WriteLine("Generated: {0}", serializedResult);

            reader = XmlReaderImpl.Create() as XmlReaderImpl;
            reader.SetString(serializedResult);

            var anyValueTypeExtraction = factory.ReadXml(reader) as XdtoDataValue;

            if (anyValueTypeExtraction == null)
            {
                throw new Exception("Новый XDTO не разобрался!");
            }
            Console.WriteLine("Serialized:{0}", anyValueTypeExtraction.Value);
        }
Exemplo n.º 20
0
 /// <summary>
 /// Serializes given object.
 /// </summary>
 /// <typeparam name="T">The object type.</typeparam>
 /// <param name="schema">Serialization schema.</param>
 /// <param name="writer">The xml writer.</param>
 /// <param name="obj">The object to serialize.</param>
 public static void Write <T>(this IScope schema, XmlWriter writer, T obj)
 {
     using (var impl = XmlWriterImpl.Create(writer))
         Write(schema, impl, obj);
 }
Exemplo n.º 21
0
        public override void CallAsFunction(int methodNumber, IValue [] arguments, out IValue retValue)
        {
            var operation = _operations [methodNumber];

            retValue = ValueFactory.Create();

            ConnectIfNeeded();

            var headers = new MapImpl();

            headers.Insert(ValueFactory.Create("Content-Type"), ValueFactory.Create("application/xml"));

            var xmlBody = XmlWriterImpl.Create();

            xmlBody.SetString(ValueFactory.Create("UTF-8"));

            xmlBody.WriteStartElement("soap:Envelope");
            xmlBody.WriteNamespaceMapping("xsi", "http://www.w3.org/2001/XMLSchema-instance");
            xmlBody.WriteNamespaceMapping("xsd", "http://www.w3.org/2001/XMLSchema");
            xmlBody.WriteNamespaceMapping("soap", "http://schemas.xmlsoap.org/soap/envelope/");
            xmlBody.WriteNamespaceMapping("s", Endpoint.Interface.NamespaceURI);

            xmlBody.WriteStartElement("soap:Body");

            var serializer = XdtoSerializerImpl.Constructor(XdtoFactory) as XdtoSerializerImpl;

            operation.WriteRequestBody(xmlBody, serializer, arguments);

            xmlBody.WriteEndElement();              // soap:Body
            xmlBody.WriteEndElement();              // soap:Envelope

            var requestString = xmlBody.Close().ToString();

            if (DoDebug)
            {
                Console.WriteLine(requestString);
            }

            var responseText = _transport.Handle(requestString);
            var xmlResult    = XmlReaderImpl.Create() as XmlReaderImpl;

            if (DoDebug)
            {
                Console.WriteLine(responseText);
            }

            // TODO: Отдать на разбор фабрике
            xmlResult.SetString(responseText);

            var result = operation.ParseResponse(xmlResult, serializer);

            if (result is SoapExceptionResponse)
            {
                throw new ScriptEngine.Machine.RuntimeException((result as SoapExceptionResponse).FaultMessage);
            }

            var soapResponse = result as SuccessfulSoapResponse;

            retValue = soapResponse.RetValue;

            foreach (var outParamData in soapResponse.OutputParameters)
            {
                var argument = arguments [outParamData.Key] as IVariable;
                if (argument == null)
                {
                    continue;
                }

                argument.Value = outParamData.Value;
            }
        }
Exemplo n.º 22
0
        public string GenerateWsdl()
        {
            var writer = new XmlWriterImpl();

            writer.SetString();
            writer.WriteXMLDeclaration();

            writer.WriteStartElement("definitions");

            writer.WriteNamespaceMapping("", "http://schemas.xmlsoap.org/wsdl/");
            writer.WriteNamespaceMapping("soap12bind", "http://schemas.xmlsoap.org/wsdl/soap12/");
            writer.WriteNamespaceMapping("soapbind", "http://schemas.xmlsoap.org/wsdl/soap/");
            writer.WriteNamespaceMapping("tns", NamespaceUri);
            writer.WriteAttribute("name", Name);
            writer.WriteAttribute("targetNamespace", NamespaceUri);

            #region definitions/types

            writer.WriteStartElement("types");

            writer.WriteStartElement("xs:schema");
            writer.WriteNamespaceMapping("xs", "http://www.w3.org/2001/XMLSchema");
            writer.WriteNamespaceMapping("tns", NamespaceUri);

            writer.WriteAttribute("targetNamespace", NamespaceUri);
            writer.WriteAttribute("attributeFormDefault", "unqualified");
            writer.WriteAttribute("elementFormDefault", "qualified");

            foreach (var operation in operations.Values)
            {
                foreach (var part in operation.Parameters.Parts)
                {
                    writer.WriteStartElement("xs:element");
                    writer.WriteAttribute("name", part.Name);

                    writer.WriteStartElement("xs:complexType");
                    writer.WriteStartElement("xs:sequence");
                    foreach (var param in part.Parameters)
                    {
                        if (param.ParameterDirection == ParameterDirectionEnum.Out)
                        {
                            continue;
                        }

                        writer.WriteStartElement("xs:element");
                        writer.WriteAttribute("name", param.Name);
                        writer.WriteAttribute("type", "xs:anyType");
                        writer.WriteEndElement();                          // xs:element
                    }

                    writer.WriteEndElement();                      // xs:sequence
                    writer.WriteEndElement();                      // xs:complexType
                    writer.WriteEndElement();                      // xs:element
                }

                writer.WriteStartElement("xs:element");
                writer.WriteAttribute("name", operation.ReturnValue.MessagePartName);

                writer.WriteStartElement("xs:complexType");
                writer.WriteStartElement("xs:sequence");

                writer.WriteStartElement("xs:element");
                writer.WriteAttribute("name", "return");
                writer.WriteAttribute("type", "xs:anyType");
                writer.WriteEndElement();                  // xs:element

                foreach (var param in operation.Parameters)
                {
                    if (param.ParameterDirection == ParameterDirectionEnum.In)
                    {
                        continue;
                    }

                    writer.WriteStartElement("xs:element");
                    writer.WriteAttribute("name", param.Name);
                    writer.WriteAttribute("type", "xs:anyType");
                    writer.WriteEndElement();                      // xs:element
                }

                writer.WriteEndElement();                  // xs:sequence
                writer.WriteEndElement();                  // xs:complexType
                writer.WriteEndElement();                  // xs:element
            }


            writer.WriteEndElement();              // xs:schema
            writer.WriteEndElement();              // types
            #endregion

            #region definitions/messages
            foreach (var operation in operations.Values)
            {
                writer.WriteStartElement("message");
                writer.WriteAttribute("name", string.Format("{0}RequestMessage", operation.Name));

                foreach (var part in operation.Parameters.Parts)
                {
                    writer.WriteStartElement("part");
                    writer.WriteAttribute("name", part.Name);
                    writer.WriteAttribute("element", part.ElementName);
                    writer.WriteEndElement();              // part
                }
                writer.WriteEndElement();                  // message

                writer.WriteStartElement("message");
                writer.WriteAttribute("name", string.Format("{0}ResponseMessage", operation.Name));

                writer.WriteStartElement("part");
                writer.WriteAttribute("name", "parameters");
                writer.WriteAttribute("element", operation.ReturnValue.MessagePartName);
                writer.WriteEndElement();                  // part

                writer.WriteEndElement();                  // message
            }
            #endregion

            #region definitions/portType
            var portTypeName = string.Format("{0}PortType", Name);

            writer.WriteStartElement("portType");
            writer.WriteAttribute("name", portTypeName);

            foreach (var operation in operations.Values)
            {
                writer.WriteStartElement("operation");
                writer.WriteAttribute("name", operation.Name);

                writer.WriteStartElement("input");
                writer.WriteAttribute("message", string.Format("{0}RequestMessage", operation.Name));
                writer.WriteEndElement();                  // input

                writer.WriteStartElement("output");
                writer.WriteAttribute("message", string.Format("{0}ResponseMessage", operation.Name));
                writer.WriteEndElement();                  // output

                writer.WriteEndElement();                  // operation
            }

            writer.WriteEndElement();              // portType
            #endregion

            #region definitions/binding
            var mainBindingName = string.Format("{0}Binding", Name);

            writer.WriteStartElement("binding");
            writer.WriteAttribute("name", mainBindingName);
            writer.WriteAttribute("type", portTypeName);

            writer.WriteStartElement("soapbind:binding");
            writer.WriteAttribute("style", "document");
            writer.WriteAttribute("transport", "http://schemas.xmlsoap.org/soap/http");
            writer.WriteEndElement();              // soapbind:binding

            foreach (var operation in operations.Values)
            {
                var soapActionString = string.Format("{0}#{1}:{2}", NamespaceUri, Name, operation.Name);

                writer.WriteStartElement("operation");
                writer.WriteAttribute("name", operation.Name);

                writer.WriteStartElement("soapbind:operation");
                writer.WriteAttribute("style", "document");
                writer.WriteAttribute("soapAction", soapActionString);

                writer.WriteStartElement("input");
                writer.WriteStartElement("soapbind:body");
                writer.WriteAttribute("use", "literal");
                writer.WriteEndElement();                  // soapbind:body
                writer.WriteEndElement();                  // input

                writer.WriteStartElement("output");
                writer.WriteStartElement("soapbind:body");
                writer.WriteAttribute("use", "literal");
                writer.WriteEndElement();                  // soapbind:body
                writer.WriteEndElement();                  // output

                writer.WriteEndElement();                  // soapbind:operation
                writer.WriteEndElement();                  // operation
            }

            writer.WriteEndElement();              // binding

            #endregion

            #region definitions/service
            var serviceUrl = "http://localhost/service";

            writer.WriteStartElement("service");
            writer.WriteStartElement("port");

            var mainPortName = string.Format("{0}Soap", Name);
            writer.WriteAttribute("name", mainPortName);
            writer.WriteAttribute("binding", string.Format("tns:{0}", mainBindingName));

            writer.WriteStartElement("documentation");
            writer.WriteEndElement();              // documentation

            writer.WriteStartElement("soapbind:address");
            writer.WriteAttribute("location", serviceUrl);
            writer.WriteEndElement();              // soapbind:address


            writer.WriteEndElement();              // port
            writer.WriteEndElement();              // service

            #endregion

            writer.WriteEndElement();              // definitions

            return(writer.Close().AsString());
        }