Десериализация XML в объекты C # - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть следующая XML-схема, которую я пытаюсь десериализовать в объекты C #:

<TMMAI>
     <StringReturn>123456789</StringReturn>
     <VectorReturn>
          <VectorElement>test1</VectorElement>
          <VectorElement>test2</VectorElement>
          <VectorElement>test3</VectorElement>
          <VectorElement>test4</VectorElement>
          <VectorElement>test5</VectorElement>
          <VectorElement>test6</VectorElement>
          <VectorElement>test7</VectorElement>
     </VectorReturn>
</TMMAI>

и объекты C #, в которые я хочу десериализоваться (сгенерированные из https://xmltocsharp.azurewebsites.net/,, но вставкав приведенной выше схеме XML):

    [XmlRoot(ElementName = "VectorReturn")]
    public class VectorReturn
    {
        [XmlElement(ElementName = "VectorElement")]
        public List<string> VectorElement { get; set; }
    }

    [XmlRoot(ElementName = "TMMAI")]
    public class TMMAI
    {
        [XmlElement(ElementName = "VectorReturn")]
        public VectorReturn VectorReturn { get; set; }
        [XmlElement(ElementName= "StringReturn")]
        public string StringReturn { get; set; }
    }

После запуска и использования стандартного XmlDeserializer, VectorElement имеет длину 0 без данных внутри него.

Я также попытался создать свойсобственная иерархия объектов, которая была следующей, вместо использования инструмента генерации:

    [XmlRoot("TMMAI")]
    public class TMMAI
    {
        [XmlElement("StringReturn")]
        public string StringReturn { get; set; }
        [XmlElement("VectorReturn")]
        public VectorReturn VectorReturn { get; set; }
    }

    public class VectorReturn
    {
        [XmlElement("VectorElement")]
        public List<VectorElement> VectorElements { get; set; }
    }

    public class VectorElement
    {
        public string Element { get; set; }
    }

Этот приблизил меня - VectorElements был размером 7, что было правильным количеством <VectorElement> элементов втестовый XML, но значение каждого VectorElement.Element было null.

Я близок, но не могу сказать, что не так в этом пункте.Неправильный атрибут?Неправильный дизайн объекта?Нужно использовать атрибут XmlArray?

1 Ответ

0 голосов
/ 25 сентября 2019

Visual Studio 2015 или выше имеют встроенный конвертер XML в класс.Это может дать вам преимущество по сравнению с сериализацией / десериализацией. Редактирование фотографии -> Специальная прошивка -> XML для классов.

Ниже представлен сгенерированный класс с использованием VS2019 -

// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.
    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class TMMAI
    {

        private uint stringReturnField;

        private string[] vectorReturnField;
        // Default constructor
        public TMMAI() {} 
        /// <remarks/>
        public uint StringReturn
        {
            get
            {
                return this.stringReturnField;
            }
            set
            {
                this.stringReturnField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("VectorElement", IsNullable = false)]
        public string[] VectorReturn
        {
            get
            {
                return this.vectorReturnField;
            }
            set
            {
                this.vectorReturnField = value;
            }
        }
    }
...