我可以使用接口和多态将两个不同的xml文件反序列化为一个对象类型吗?

时间:2010-06-30 12:24:15

标签: c# xml

我有两个xml文件,它们具有相同的数据,但标签的名称不同。一个已命名参考标记,而另一个具有短版本。

由于数据完全相同,我希望能够将这些文件反序列化为对象,但我不想处理两个单独的对象。

要反序列化我创建了以下类的文件:

[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; }        
}

对于带有短标签的文件我有:

[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; }      
}

我曾经使用过接口,但不确定如何让Header和Product正确返回。它们对于每个版本也是不同的。

有没有更好的方法来反序列化xml?或者这仍然可以用我已经拥有的东西来完成?

非常感谢任何帮助。

编辑:

仅花了五年时间,但我发现了!这可以通过使用XmlAttributeOverrides来实现。 http://www.ikriv.com/dev/dotnet/OverrideXml.shtml

1 个答案:

答案 0 :(得分:0)

接口可能是最好的方法..我要做的是将界面与工厂混淆,并做类似的事情:

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.
    }
}

由此您创建两个专门的读者并使用工厂来控制使用任何读者所需的消息创建。更棘手的部分是确定哪个读者将是使用者。

希望能让你开始......