Десериализовать 2 типа xml в один класс

У меня ниже 2 формата XML. Возможно ли иметь один класс, в котором я могу десериализовать оба этих типа данных XML? Если да, то как должно выглядеть определение моего класса?

string xmlText1 = @"<PARM KEY=""K1"" VALUE=""V1""/>";
string xmlText2 = @"<PARM><KEY>K2</KEY><VALUE>V2</VALUE></PARM>";

[XmlRoot(ElementName = "PARM")]
public class ParmInfo
{
    [XmlElement("KEY")]
    public string ParmKey { get; set; }

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

    public ParmInfo()
    {

    }

    public ParmInfo(string inpParmKey, string inpParmVal)
    {
        ParmKey = inpParmKey;
        ParmVal = inpParmVal;
    }
}

Вышеупомянутый класс будет работать с xmlText2. Как мне изменить его для обработки как xmlText1, так и xmlText2?

Спасибо!

0
0
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте это, если вам нужен один класс для обоих XML

string xmlText1 = @"<PARM KEY=""K1"" VALUE=""V1""/>";
string xmlText2 = @"<PARM><KEY>K2</KEY><VALUE>V2</VALUE></PARM>";

[XmlRoot(ElementName = "PARM")]
public class ParmInfo
{
    [XmlAttribute("KEY")]
    public string ParmAttrKey { get; set; }

    [XmlAttribute("VALUE")]
    public string ParmAttrVal { get; set; }

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

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

    public ParmInfo()
    {

    }

    public ParmInfo(string inpParmEleKey, string inpParmEleVal, string inpParmAttrKey, string inpParmAttrVal)
    {
        ParmEleKey = inpParmEleKey;
        ParmEleVal = inpParmEleVal;
        ParmAttrKey = inpParmAttrKey;
        ParmAttrVal = inpParmAttrVal;
    }
}

Это то, что я использовал для сериализации

string xmlText1 = @"<PARM KEY=""K1"" VALUE=""V1""/>";
string xmlText2 = @"<PARM><KEY>K2</KEY><VALUE>V2</VALUE></PARM>";

XmlSerializer serializer = new XmlSerializer(typeof(ParmInfo));

StringReader stringReader = new StringReader(xmlText1);
var xmlText1Serialized = (ParmInfo)serializer.Deserialize(stringReader);

stringReader = new StringReader(xmlText2);
var xmlText2Serialized = (ParmInfo)serializer.Deserialize(stringReader);

Спасибо за предложение. Но цель не состоит в том, чтобы иметь в классе 2 отдельных набора свойств. Использование любого из форматов XML должно означать то же самое после его сериализации в этот объект. Но это дало мне представление.

askids 11.09.2018 21:14
Ответ принят как подходящий

Это то, что я в итоге сделал. Я надеялся избежать этого. Но все таки.

[Serializable]
[XmlRoot(ElementName = "PARM")]
public class ParmInfo
{
    private string _ParmName;
    private string _ParmVal;
    private bool _UsingAttr = false;

    [XmlElement("KEY", IsNullable = true)]
    public string ParmName
    {
        get
        {
            return _ParmName;
        }
        set
        {
            if(!string.IsNullOrEmpty(value))
            {
                _ParmName = value;
                _UsingAttr = false;
            }
        }
    }

    [XmlElement("VALUE", IsNullable = true)]
    public string ParmVal
    {
        get
        {
            return _ParmVal;
        }
        set
        {
            if (!string.IsNullOrEmpty(value))
            {
                _ParmVal = value;
            }
        }
    }

    [XmlAttribute("KEY")]
    public string ParmNameAttr
    {
        get
        {
            return _ParmName;
        }
        set
        {
            if (!string.IsNullOrEmpty(value))
            {
                _ParmName = value;
                _UsingAttr = true;
            }
        }
    }

    [XmlAttribute("VALUE")]
    public string ParmValueAttr
    {
        get
        {
            return _ParmVal;
        }
        set
        {
            if (!string.IsNullOrEmpty(value))
            {
                _ParmVal = value;
            }
        }
    }


    public ParmInfo()
    {

    }

    public ParmInfo(string inpParmName, string inpParmVal)
    {
        ParmName = inpParmName;
        _ParmVal = inpParmVal;
    }
}

Другие вопросы по теме