Generating Xml Documents Using Inheritance

I would like to have a base class that implements most of this example and inherits the parts that are different. All messages are the same except for the node message, which can be very different. Does anyone know how to do this?

[XmlRoot("Package")]
public class Package
{
    [XmlElement("Parameters")]
    public parameters Parameters;
    public class parameters
    {
        [XmlElement("MessageType")]
        public string MessageType { get; set; }

        [XmlElement("CreationDateTime")]
        public string CreationDateTime { get; set; }

        //etc...
    }

    [XmlElement("Message")]
    public message Message;
    public class message
    {
        // here I want different message types
        // hopefully through inheritance
    }
}

      

For example, I want it sometimes ...

<Package>
    <Parameters>
        <MessageType></MessageType>
        <CreationDateTime></CreationDateTime>
        <MessageId></MessageId>
    </Parameters>
    <Message>
        <MessageTypeRequest>
            <etc1></etc1>
            <etc2></etc2>
        </MessageTypeRequest>
    </Message>
</Package>

      

... but I want it some other time.

<Package>
    <Parameters>
        <MessageType></MessageType>
        <CreationDateTime></CreationDateTime>
        <MessageId></MessageId>
    </Parameters>
    <Message>
        <MessageTypeResponse>
            <etc1></etc1>
            <etc2></etc2>
        </MessageTypeResponse>
    </Message>
</Package>

      

+3


source to share


3 answers


If you have a class

public class Message { }

then you can create new post types by inheriting from them (of course you know this part):

public class Request : Message { ... }  
public class Response : Message { ... }

      



Now, if you want to be able to assign instances of these classes to your Package.Message property and want them to be serialized properly, you must include these inherited types via attributes:

[XmlInclude(typeof(Request))]
[XmlInclude(typeof(Response))]
public class Package { ... }

      

The resulting Xml would look a little different, but it has the same meaning:

<Message d3p1:type="Request" xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance">
...
</Message>

      

+1


source


Thanks Botz3000 for your answer and your hints helped.

I'm going with this, which gives accurate results. Though I would prefer that the base class doesn't know the classes that consume it. Here's the code:



[XmlRoot("Package")]
public class Package
{
    public Package() { }
    public Package(MessageTypeRequest req)
    {
        Message = new message();
        Message.requestMessage = req;
    }
    public Package(MessageTypeResponse resp)
    {
        Message = new message();
        Message.responseMessage = resp;
    }

    [XmlElement("Parameters")]
    public parameters Parameters;
    public class parameters
    {
        [XmlElement("MessageType")]
        public string MessageType { get; set; }

        [XmlElement("CreationDateTime")]
        public string CreationDateTime { get; set; }
    }

    [XmlElement("Message")]
    public message Message;
    public class message
    {
        [XmlElement("MessageTypeRequest")]
        public MessageTypeRequest requestMessage { get; set; }

        [XmlElement("MessageTypeResponse")]
        public MessageTypeResponse responseMessage { get; set; }
    }
}

public class MessageTypeRequest : Package
{
    public MessageTypeRequest()
    {
        etc1 = "A simple request.";
        etc2 = "test 2";
    }

    [XmlElement("etc1")]
    public string etc1 { get; set; }

    [XmlElement("etc2")]
    public string etc2 { get; set; }
}

public class MessageTypeResponse : Package
{
    public MessageTypeResponse()
    {
        etc1 = "My simple response";
        etc2 = "test 2";
    }

    [XmlElement("etc1")]
    public string etc1 { get; set; }

    [XmlElement("etc2")]
    public string etc2 { get; set; }
}

      

+1


source


As it turned out, after adding additional properties to my message classes, serialization started to serialize the XML file incorrectly, including elements in the base class in the derived class, and also ... this is what fixed the problem:

[XmlRoot("Package")]
public class Package
{
    public Package() { }
    public Package(MessageContent messageContent)
    {
        Message = new message();
        Message.messageContent = messageContent;
    }

    [XmlElement("Parameters")]
    public parameters Parameters;
    public class parameters
    {
        [XmlElement("MessageType")]
        public string MessageType { get; set; }

        [XmlElement("CreationDateTime")]
        public string CreationDateTime { get; set; }
    }

    [XmlElement("Message")]
    public message Message;
    public class message
    {
        [XmlElement(Type = typeof(MessageTypeRequest)), XmlElement(Type = typeof(MessageTypeResponse))]
        public MessageContent messageContent { get; set; }
    }
}

public class MessageContent { }

public class MessageTypeRequest : MessageContent
{
    public MessageTypeRequest()
    {
        etc1 = "A simple request.";
        etc2 = "test 2";
    }

    public static Package MessageRequest()
    {
        return new Package(new MessageTypeRequest());
    }

    [XmlElement("etc1")]
    public string etc1 { get; set; }

    [XmlElement("etc2")]
    public string etc2 { get; set; }
}

public class MessageTypeResponse : MessageContent
{
    public MessageTypeResponse()
    {
        etc1 = "My simple response";
        etc2 = "test 2";
    }

    public static Package MessageRequest()
    {
        return new Package(new MessageTypeResponse());
    }

    [XmlElement("etc1")]
    public string etc1 { get; set; }

    [XmlElement("etc2")]
    public string etc2 { get; set; }
}

      

0


source







All Articles