Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以使用接口或多态性将两个不同的xml文件反序列化为一个对象类型吗?_C#_Xml - Fatal编程技术网

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

C# 我可以使用接口或多态性将两个不同的xml文件反序列化为一个对象类型吗?,c#,xml,C#,Xml,我有两个xml文件,它们具有相同的数据,但标记的名称不同。一个具有命名引用标记,而另一个具有简短版本 由于数据完全相同,我希望能够将这些文件反序列化为对象,但我不希望必须处理两个独立的对象 要反序列化我创建的文件,请使用以下类: [XmlRoot(ElementName="Message")] public class ONIXMessage { [XmlAttribute(AttributeName="release")] public string Release { get

我有两个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”)]
公共类onix消息
{
[XmlAttribute(AttributeName=“release”)]
公共字符串释放{get;set;}
[XmlElement(“标题”)]
公共标头{get;set;}
[XmlElement(“产品”)]
公共列表产品{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; }      
}
[XmlRoot(ElementName=“message”)]
公共类onix消息
{
[XmlAttribute(AttributeName=“release”)]
公共字符串释放{get;set;}
[XmlElement(“x1”)]
公共标头{get;set;}
[XmlElement(“x2”)]
公共列表产品{get;set;}
}
我尝试过使用接口,但不确定如何正确返回标题和产品。对于每个版本,它们也是不同的

有没有更好的方法来反序列化xml?或者我已经拥有的东西还能这样做吗

任何帮助都将不胜感激

编辑:

只花了五年时间,但我发现了!这可以通过使用XmlAttributeOverrides实现。
接口可能是最好的方式。。我要做的是将界面与工厂混淆,并执行类似的操作:

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.
    }
}
公共接口IMessageReader()
{
ONIXMessage读取(字符串xml);
}
ONIXMessageFactory上的公共静态类
{
私有静态IList读卡器=新列表();
公共静态ONIXMessage CreateMessage(字符串xml)
{
var reader=GetReader(xml);
返回reader.Read(xml);
}
公共静态IMessageReader GetReader(字符串xml)
{
//以某种方式确定需要哪个读卡器。
}
}
您可以创建两个专门的读卡器,并使用工厂控制消息的创建,使用所需的读卡器。更棘手的部分是确定使用哪个阅读器


希望这能让你开始…

接口可能是最好的方式。。我要做的是将界面与工厂混淆,并执行类似的操作:

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.
    }
}
公共接口IMessageReader()
{
ONIXMessage读取(字符串xml);
}
ONIXMessageFactory上的公共静态类
{
私有静态IList读卡器=新列表();
公共静态ONIXMessage CreateMessage(字符串xml)
{
var reader=GetReader(xml);
返回reader.Read(xml);
}
公共静态IMessageReader GetReader(字符串xml)
{
//以某种方式确定需要哪个读卡器。
}
}
您可以创建两个专门的读卡器,并使用工厂控制消息的创建,使用所需的读卡器。更棘手的部分是确定使用哪个阅读器


希望这能让你开始…

我必须快速阅读有关工厂的资料,如果这是错误的,请原谅我。这是否允许我在xml文件中选择不同的读取方式,以便将short和reference都添加到ONIXMessage中?我想我应该问一个关于如何反序列化复杂xml文件的问题。然而,当我最终弄明白这一点时,这将是有用的。谢谢,我不认为用直接的Xml反序列化就可以做到这一点,因为每个成员/类型只能应用一次XmlRootAttribute和XmlAttributeAttribute属性(phew)。尽管如此,我还是认为我必须找到一种更好的方法来处理Xml文件。我必须快速阅读有关工厂的内容,如果这是错误的,请原谅我。这是否允许我在xml文件中选择不同的读取方式,以便将short和reference都添加到ONIXMessage中?我想我应该问一个关于如何反序列化复杂xml文件的问题。然而,当我最终弄明白这一点时,这将是有用的。谢谢,我不认为用直接的Xml反序列化就可以做到这一点,因为每个成员/类型只能应用一次XmlRootAttribute和XmlAttributeAttribute属性(phew)。尽管如此,看来我必须找到更好的方法来处理Xml文件。