I want to be able to load a serialized xml class to a Soap Envelope. I am starting so I am not filling the innards so it appears like:
<Envelope xmlns='http://schemas.xmlsoap.org/soap/envelope/' />
I want it to appear like:
<Envelope xmlns='http://schemas.xmlsoap.org/soap/envelope/' ></Envelope>`
The class I wrote is this:
[System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = 'http://schemas.xmlsoap.org/soap/envelope/')] [System.Xml.Serialization.XmlRootAttribute(Namespace = 'http://schemas.xmlsoap.org/soap/envelope/',ElementName='Envelope', IsNullable = true)] public class TestXmlEnvelope { [System.Xml.Serialization.XmlElement(ElementName='Body', Namespace='http://schemas.xmlsoap.org/soap/envelope/')] public System.Collections.ArrayList Body = new System.Collections.ArrayList(); } //class TestXmlEnvelope`
I am using this as an example since other people might want it in an individual element. I am sure this must be simple but sadly I don’t know the right keyword for this.
As always thanks for your help.
[Edit] The error comes when I try to use this instruction
System.Xml.Serialization.XmlSerializer xmlout = new System.Xml.Serialization.XmlSerializer(typeof(TestXmlEnvelope)); System.IO.MemoryStream memOut = new System.IO.MemoryStream(); xmlout.Serialize(memOut, envelope, namespc); Microsoft.Web.Services.SoapEnvelope soapEnv = new Microsoft.Web.Services.SoapEnvelope(); soapEnv.Load(memOut);
It gives me error ‘Root Element not found’.
[Edit] I fixed the error the problem was that after I serialized the object I didn’t set the memOut.Position = 0. Still I hope this question helps other people that may want to do this.
The main issue here is that the
XmlSerializercallsWriteEndElement()on theXmlWriterwhen it would write an end tag. This, however, generates the shorthand<tag/>form when there is no content. TheWriteFullEndElement()writes the end tag separately.You can inject your own
XmlTextWriterinto the middle that the serializer would then use to exhibit that functionality.Given that
serializeris the appropriateXmlSerializer, try this:[Edit] for the case of your added code, add facade constructors for:
Then, use the memory stream as your inner stream in the constructor as before: