Десериализация нескольких XML-тегов в один объект C #

#c# #xml #serialization #xml-deserialization

#c# #xml #сериализация #xml-десериализация

Вопрос:

У меня есть структура классов следующим образом

    public class Common
    {
        public int price { get; set; }
        public string color { get; set; }
    }
    public class SampleProduct:Common
    {
        public string sample1 { get; set; }
        public string sample2 { get; set; }
        public string sample3 { get; set; }
    }
  

У меня есть XML-файл следующим образом

 <ConfigData>
  <Common>
    <price>1234</price>
    <color>pink</color>    
  </Common>
  <SampleProduct>
    <sample1>new</sample1>
    <sample2>new</sample2>
    <sample3>new123</sample3>
  </SampleProduct>
</ConfigData>
  

Теперь я хотел десериализовать полные данные XML в объект SampleProduct (одиночный объект).Я могу десериализовать XML-данные в другой объект, но не в один объект. Пожалуйста, помогите.

Комментарии:

1. Вы создаете XML-файл самостоятельно или он предоставляется в другом месте?

2. вам просто нужно создать новое имя класса «ConfigData» и поместить Common и SampleProduct в этот класс. Используйте ConfigData, чем для десериализации

3. Я предложил внести правку, чтобы изменить структуру классов, так что вы ищете это?

Ответ №1:

Если вы создаете XML самостоятельно, просто сделайте это следующим образом:

 <ConfigData>
  <SampleProduct>
    <price>1234</price>
    <color>pink</color>    
    <sample1>new</sample1>
    <sample2>new</sample2>
    <sample3>new123</sample3>
  </SampleProduct>
</ConfigData>
  

В противном случае, если вы получаете XML из других источников, сделайте то, что предложил Каяни в своем комментарии:

 public class ConfigData
{
    public Common { get; set; }
    public SampleProduct { get; set; }
}
  

Но не забывайте, что созданный таким образом SampleProduct не имеет свойств «цена» и «цвет», и они должны быть установлены с использованием созданного общего экземпляра

Ответ №2:

Вот полное решение, использующее предоставленный вами XML.

     public static void Main(string[] args)
    {
        DeserializeXml(@"C:sample.xml");
    }
    public static void DeserializeXml(string xmlPath)
    {
        try
        {
            var xmlSerializer = new XmlSerializer(typeof(ConfigData));
            using (var xmlFile = new FileStream(xmlPath, FileMode.Open))
            {
                var configDataOSinglebject = (ConfigData)xmlSerializer.Deserialize(xmlFile);
                xmlFile.Close();
            }
        }
        catch (Exception e)
        {
            throw new ArgumentException("Something went wrong while interpreting the xml file: "   e.Message);
        }
    }

    [XmlRoot("ConfigData")]
    public class ConfigData
    {
        [XmlElement("Common")]
        public Common Common { get; set; }

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

    public class Common
    {
        [XmlElement("price")]
        public string Price { get; set; }

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

    public class SampleProduct
    {
        [XmlElement("sample1")]
        public string Sample1 { get; set; }

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

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

Это даст вам единый объект со всеми необходимыми элементами.

Комментарии:

1. переменная configDataOSinglebject предоставляет вам объект. Я забыл добавить туда комментарий.