tags:

views:

46

answers:

1

Hi,

I have two xml files which have the same data but different names for the tags. One has named reference tags while the other has a short version.

As the data is exactly the same i want to be able to deserialise these files into objects, but I don't want to have to deal with two seperate objects.

To deserialise the files i have created the following class:

[XmlRoot(ElementName="Message")]
public class ONIXMessage
{
    [XmlAttribute(AttributeName="release")]
    public string Release { get; set; }

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

    [XmlElement("Product")]
    public List<Product> Products { get; set; }        
}

For the files with the short tags i have this:

[XmlRoot(ElementName="message")]
public class ONIXMessage
{
    [XmlAttribute(AttributeName="release")]
    public string Release { get; set; }

    [XmlElement("x1")]
    public Header Header { get; set; }

    [XmlElement("x2")]
    public List<Product> Products { get; set; }      
}

I had a go using interfaces but wasn't really sure how to get the Header and Product to return correctly. They are different for each version too.

Is there a better way to deserialise the xml? Or can this still be done with what i already have?

Any help would be much appreciated.

Si

A: 

Interfaces are probably the best way to go.. What I would do is mix up the interface with a factory, and do something similar to:

public interface IMessageReader()
{
    ONIXMessage Read(string xml);
}

public static class ONIXMessageFactory
{
    private static IList<IMessageReader> readers = new List<IMessageReader>();

    public static ONIXMessage CreateMessage(string xml)
    {
      var reader = GetReader(xml);
      return reader.Read(xml);
    }

    public static IMessageReader GetReader(string xml)
    {
      // Somehow identify which reader would be required.
    }
}

Whereby you create two specialised readers and use a factory to control the creation of the message using whichever reader is required. The trickier part is identifying which reader would be the one to use.

Hope that gets you started...

Matthew Abbott
I've had to quickly read up on factories so forgive me if this is incorrect. Does this allow me to choose different ways of reading in the xml file so that both short and reference can be added to ONIXMessage?I think i should have asked a question on how to deserialise a complex xml file. However this will be useful when i eventually figure that out. Thanks
Simon
I don't think you can do this with straight Xml deserialisation, because the XmlRootAttribute and XmlAttributeAttribute attributes (phew) can only be applied once per member/type.
Matthew Abbott
Thought as much looks like i'll have to find a better way of handling the xml files.
Simon